在pytorch中,tensor的实际数据以一维数组(storage)的形式存储于某个连续的内存中,“行优先”进行存储。

1. tensor的连续性

tensor连续(contiguous)是指tensor的storage元素排列顺序与其按行优先时的元素排列顺序相同。如下图所示:

        出现不连续现象,本质上是由于pytorch中不同tensor可能共用同一个storage导致的。
pytorch的很多操作都会导致tensor不连续,如tensor.transpose()(tensor.t())、tensor.narrow()、tensor.expand()。
以转置为例,因为转置操作前后共用同一个storage,但显然转置后的tensor按照行优先排列成1维后与原storage不同了,因此转置后结果属于不连续(见下例)。

2. tensor.is_contiguous()

tensor.is_contiguous()用于判断tensor是否连续,以转置为例说明:

>>>a = torch.tensor([[1,2,3],[4,5,6]])
>>>print(a)
tensor([[1, 2, 3],[4, 5, 6]])
>>>print(a.storage())123456
[torch.LongStorage of size 6]
>>>print(a.is_contiguous()) #a是连续的
True>>>b = a.t() #b是a的转置
>>>print(b)
tensor([[1, 4],[2, 5],[3, 6]])
>>>print(b.storage())123456
[torch.LongStorage of size 6]
>>>print(b.is_contiguous()) #b是不连续的
False# 之所以出现b不连续,是因为转置操作前后是共用同一个storage的
>>>print(a.storage().data_ptr())
>>>print(b.storage().data_ptr())
2638924341056
2638924341056

3. tensor不连续的后果

        tensor不连续会导致某些操作无法进行,比如view()就无法进行。在上面的例子中:由于 b 是不连续的,所以对其进行view()操作会报错;b.view(3,2)没报错,因为b本身的shape就是(3,2)。

>>>b.view(2,3)
RuntimeError                              Traceback (most recent call last)
>>>b.view(1,6)
RuntimeError                              Traceback (most recent call last)
>>>b.view(-1)
RuntimeError                              Traceback (most recent call last)>>>b.view(3,2)
tensor([[1, 4],[2, 5],[3, 6]])

4. tensor.contiguous()

tensor.contiguous()返回一个与原始tensor有相同元素的 “连续”tensor,如果原始tensor本身就是连续的,则返回原始tensor。
        注意:tensor.contiguous()函数不会对原始数据做任何修改,他不仅返回一个新tensor,还为这个新tensor创建了一个新的storage,在这个storage上,该新的tensor是连续的。
继续使用上面的例子:

>>>c = b.contiguous()# 形式上两者一样
>>>print(b)
>>>print(c)
tensor([[1, 4],[2, 5],[3, 6]])
tensor([[1, 4],[2, 5],[3, 6]])# 显然storage已经不是同一个了
>>>print(b.storage())
>>>print(c.storage())123456
[torch.LongStorage of size 6]142536
[torch.LongStorage of size 6]
False# b不连续,c是连续的
>>>print(b.is_contiguous())
False
>>>print(c.is_contiguous())
True#此时执行c.view()不会出错
>>>c.view(2,3)
tensor([[1, 4, 2],[5, 3, 6]])

以上原文出自:tensor的连续性、tensor.is_contiguous()、tensor.contiguous() - 简书 (jianshu.com)

5. view()

类似于resize操作,基于前面所说的tensor连续存储,view()函数把原tensor中的数据按照行优先的顺序排成一个一维的数据,然后按照参数组合成其他维度的tensor。

举个例子:

a=torch.Tensor([[[1,2,3],[4,5,6]]])
b=torch.Tensor([1,2,3,4,5,6])print(a.view(1,6))
print(b.view(1,6))# 输出结果都是 tensor([[1, 2, 3, 4, 5, 6]]) 

再如输出3维向量:

a=torch.Tensor([[[1,2,3],[4,5,6]]])
print(a.view(3,2))
#输出结果为:
#tensor([[1, 2],
#        [3, 4],
#        [5, 6]])

6. nn.Sequential()

一个序列容器,用于搭建神经网络的模块被按照被传入构造器的顺序添加到nn.Sequential()容器中。除此之外,一个包含神经网络模块的OrderedDict也可以被传入nn.Sequential()容器中。利用nn.Sequential()搭建好模型架构,模型前向传播时调用forward()方法,模型接收的输入首先被传入nn.Sequential()包含的第一个网络模块中。然后,第一个网络模块的输出传入第二个网络模块作为输入,按照顺序依次计算并传播,直到nn.Sequential()里的最后一个模块输出结果。
        即nn.Sequential()相当于把多个模块封装成一个模块。它与nn.ModuleList()不同,nn.ModuleList()只是存储网络模块的list,其中的网络模块之间没有连接关系和顺序关系

7.permute()

permute()函数将tensor的维度换位,相当于同时操作tensor的若干维度,与transpose()函数不同,transpose()只能同时作用于tensor的两个维度。

如:

>>>torch.randn(2,3,4,5).permute(3,2,0,1).shape
# 输出结果为torch.size([5,4,2,3])
# 上面的结果等价于:
>>>torch.randn(2,3,4,5).transpose(3,0).transpose(2,1).transpose(3,2).shape
# 输出结果为torch.size([5,4,2,3])

PyTorch中contiguous、view、Sequential、permute函数的用法相关推荐

  1. Pytorch中tensor.view().permute().contiguous()函数理解

    Pytorch中tensor.view().permute().contiguous()函数理解 yolov3中有一行这样的代码,在此记录一下三个函数的含义 # 例子中batch_size为整型,le ...

  2. pytorch 中 contiguous() 函数理解

    pytorch 中 contiguous() 函数理解 文章目录 pytorch 中 contiguous() 函数理解 引言 使用 contiguous() 后记 文章抄自 Pytorch中cont ...

  3. 机器学习9:关于pytorch中的zero_grad()函数

    机器学习9:关于pytorch中的zero_grad()函数 本文参考了博客Pytorch 为什么每一轮batch需要设置optimizer.zero_grad. 1.zero_grad()函数的应用 ...

  4. JavaScript中常见的字符串操作函数及用法汇总

    转载地址:http://www.jb51.net/article/65358.htm 这篇文章主要介绍了JavaScript中常见的字符串操作函数及用法,实例汇总了javascript常见的字符串转换 ...

  5. Matlab中print, fprint, fscanf, disp函数的用法

    最近一直在用python,导致学习的一些函数就有点混淆,趁着这会儿看代码,就再回顾下Matlab中print, fprint, fscanf, disp函数的用法 一.print() 函数可以把函数图 ...

  6. pytorch:深入理解 reshape(), view(), transpose(), permute() 函数

    文章目录 前言 1. reshape() 2. view() ① 1 阶变高阶 1 阶变 2 阶 1 阶变 3 阶 1 阶变 4 阶 1 阶变 m 阶 ② 2 阶变 m 阶 ③ 3 阶变 m 阶 ④ ...

  7. Pytorch中contiguous()函数理解

    引言 在pytorch中,只有很少几个操作是不改变tensor的内容本身,而只是重新定义下标与元素的对应关系的.换句话说,这种操作不进行数据拷贝和数据的改变,变的是元数据. 会改变元数据的操作是: n ...

  8. pytorch中contiguous()

    contiguous:view只能用在contiguous的variable上.如果在view之前用了transpose, permute等,需要用contiguous()来返回一个contiguou ...

  9. pytorch中contiguous()的用法

    contiguous:view只能用在contiguous的variable上.如果在view之前用了transpose, permute等,需要用contiguous()来返回一个contiguou ...

最新文章

  1. 用viewport进行布局,将页面分成了三分,我想实现弹出的window窗口在整个viewport上...
  2. Mac的文件比对工具:Meld、Beyond Compare
  3. sql相同顺序法和一次封锁法_数据库:事务处理
  4. 【dfs】年会小游戏
  5. 论文浅尝 - WWW2020 | 生成多跳推理问题以改善机器阅读理解能力
  6. 大数据之-Hadoop3.x_MapReduce_MapTask工作机制---大数据之hadoop3.x工作笔记0124
  7. Linux应用编程基础01:Linux应用编程绪论
  8. python3.6.5安装步骤-Ubuntu16.04安装python3.6.5步骤详解
  9. Label高度根据内容变化SnapKi
  10. 锐起无盘服务器陈列设置,原创]锐起无盘安装全图文设置,含SCII设置在内
  11. Python算法教程:强连通分量
  12. 掌勤综合劳务管理系统
  13. 《SEM长尾搜索营销策略解密》一一1.4 潜藏在海平线下的长尾世界
  14. 极狐gitlib的安装和使用
  15. 信息安全技术 代码安全审计规范
  16. 2015年 网络工程师试卷答案及详解
  17. 经典 正则表达技术文档
  18. VMware Workstations 打开.vmx 虚拟机无反应问题
  19. 物联网知识之了解MOTT
  20. web前端常见面试题总结

热门文章

  1. 【DB2报错】SQLSTATE:-668 SQLCODE:57016 code “3“
  2. ACCP学习旅程之----- SQL Server(第五章 数据查询(二))
  3. 互联网思维“独孤九剑”:传统企业互联网化的心法
  4. html超链接代码(持续更新中)
  5. Geometric Search
  6. android 最新头条适配,android 平板适配,今日头条适配(同时适配手机和平板)
  7. 5ecsgo正在发送客户端_如何评价Valve今天在CSGO官方账号,发推文明确因为平台绕过了信任模式而导致使用5E用户被VAC?...
  8. windows系统下,Apache安装腾讯云SSL证书配置教程(phpstudy环境)
  9. GeoServer发布高清卫星瓦片影像数据
  10. C++学习 1: 两个无符号数相减