方法作用:返回一个内存连续的有相同数据的tensor,如果原tensor内存连续,则返回原tensor。 一般与transpose,permute,view等方法搭配使用。

使用示例:

  • 使用transpose或permute进行维度变换后,需要调用contiguous,才可使用view对维度进行变形(如:tensor_var.contiguous().view() ),示例如下:
x = torch.Tensor(2,3)
y = x.permute(1,0)         # permute:二维tensor的维度变换,此处功能相当于转置transpose
y.view(-1)                 # 报错,view使用前需调用contiguous()函数
y = x.permute(1,0).contiguous()
y.view(-1)                 # OK

具体原因有两种说法:

1.  transpose、permute等维度变换操作后,tensor在内存中不再是连续存储的,而view操作要求tensor的内存连续存储,所以需要contiguous来返回一个contiguous copy;

2. 维度变换后的变量是之前变量的浅拷贝,指向同一区域,即view操作会连带原来的变量一同变形,这是不合法的,所以也会报错;---- 这个解释有部分道理,也即contiguous返回了tensor的深拷贝contiguous copy数据;

我感觉都还挺有道理的。

  • 在pytorch中,只有很少几个操作是不改变tensor的内容本身,而只是重新定义下标与元素的对应关系。换句话说,这种操作不进行数据拷贝和数据的改变,变的是元数据,这些操作是:
narrow(),view(),expand(),transpose();

在使用transpose()进行转置操作时,pytorch并不会创建新的、转置后的tensor,而是修改了tensor中的一些属性(也就是元数据),使得此时的offset和stride是与转置tensor相对应的,而转置的tensor和原tensor的内存是共享的。

为了证明这一点,我们来看下面的代码:

x = torch.randn(3, 2)
y = x.transpose(x, 0, 1)
x[0, 0] = 233
print(y[0, 0])       # print 233

可以看到,改变了x的元素的值的同时,y的元素的值也发生了变化;也即,经过上述操作后得到的tensor,它内部数据的布局方式和从头开始创建一个常规的tensor的布局方式是不一样的!于是就有contiguous()的用武之地了。

在上面的例子中,x是contiguous的,但y不是(因为内部数据不是通常的布局方式)。注意:不要被contiguous的字面意思“连续的”误解,tensor中数据还是在内存中一块区域里,只是布局的问题!

简单来说,Contiguous()方法的作用就是:当调用contiguous()时,会强制拷贝一份tensor,让它的布局和从头创建的一模一样。

实际使用时候不用太担心,如果没在需要调用contiguous()的地方调用contiguous(),运行时会提示我们需要添加。

转载自: Pytorch之contiguous函数 - 知乎 感谢!

关于Contiguous()方法相关推荐

  1. torch.contiguous()方法

    orch.contiguous()方法语义上是"连续的",经常与torch.permute().torch.transpose().torch.view()方法一起使用,要理解这样 ...

  2. 【PyTorch】contiguous==>保证Tensor是连续的,通常transpose、permute 操作后执行 view需要此方法

    目录 PyTorch中的is_contiguous是什么含义? 行优先 为什么需要 contiguous ? contiguous 本身是形容词,表示连续的,关于 contiguous, PyTorc ...

  3. pytorch reshape_PyTorch中的contiguous

    本文讲解了pytorch中contiguous的含义.定义.实现,以及contiguous存在的原因,非contiguous时的解决办法.并对比了numpy中的contiguous. contiguo ...

  4. Pytorch基础之张量的存储方式及维度操作:size,shape,view,reshape,contiguous

    参考书目:张校捷,<深入浅出PyTorch:从模型到源码> Pytorch中张量的存储 假设存在一个k维张量,其维数为[ n 1 , n 2 . . . n k n_1,n_2...n_k ...

  5. PyTorch学习笔记(15) ——PyTorch中的contiguous

    本文转载自栩风在知乎上的文章<PyTorch中的contiguous>.我觉得很好,特此转载. 0. 前言 本文讲解了pytorch中contiguous的含义.定义.实现,以及conti ...

  6. PyTorch中的contiguous解读

    本文讲解了pytorch中contiguous的含义.定义.实现,以及contiguous存在的原因,非contiguous时的解决办法.并对比了numpy中的contiguous. contiguo ...

  7. 详解PyTorch中的contiguous

    目录 前言 PyTorch中的is_contiguous是啥? 行优先 为什么需要 contiguous ? 为什么不在view 方法中默认调用contiguous方法? 前言 contiguous ...

  8. Pytorch学习笔记——Contiguous vs non-contiguous tensor

    文章目录 前言 正文 调用contiguous会导致内存复制操作吗? 前言 原文地址:https://discuss.pytorch.org/t/contigious-vs-non-contigiou ...

  9. pytorch笔记:contiguous tensor 存储知识

    1 contiguous contiguous直观的解释是Tensor底层一维数组元素的存储顺序与Tensor按行优先一维展开的元素顺序是否一致. 1.1 tensor的存储 Tensor多维数组底层 ...

最新文章

  1. linux怎么查看mysql安装在哪里_Linux下查看MySQL的安装路径
  2. MyEclipse移动开发教程:移动Web模拟器指南(一)
  3. 提取Java集合的元素-Java 8方法
  4. DataList分页,保存CheckBox控件状态
  5. python rq asyncio_python异步IO-asyncio
  6. html php上传图片验证判断,HTML_PHP实例:上传多个图片并校验的代码,单张的图片上传是不复杂的, - phpStudy...
  7. 短信接口与短信平台收费标准----速码云仅供参考
  8. Ionic3在ts中获取html中值的方法
  9. sp根据备份文件来创建DB
  10. 別人的心得。。。。。學習
  11. 【C语言视频教程完整版】从入门到进阶,适合C语言初学者计算机考研党考计算机二级大一大二学生学习观看~~~
  12. android设置计算器页面布局,Android计算器界面布局
  13. unity3D 插件plugins
  14. GCC警告warning: control reaches end of non-void function [-Wreturn-type]|
  15. 旷视科技计算机视觉算法研究员年薪,旷视科技算法研究员面经(21个问答)
  16. html5中css新增的属性,css3有哪些新增属性?常用的新增属性总结
  17. miktex+WinEdt 安装步骤
  18. java导出excel 方式_java导出Excel通用方法
  19. 十年Java架构师分享
  20. 10.5国庆作业(IIC实验)

热门文章

  1. 某IE订位源码分享与交流
  2. latex中插入两张子图片
  3. updated beforeUpdate() Updated() 生命周期-销毁阶段 vue的nextTick@stage3---week2--day4-1
  4. VScode前进和后退按钮,非快捷键
  5. C语言scanf函数用法详细解释!!!
  6. 加入先进制造的追光者-探索现代机械设计团队的高效协作方式
  7. mysql 1146 错误处理
  8. UVA - 12325 Zombie's Treasure Chest 暴力
  9. 英文最基本的五个时态
  10. android状态栏高度px,安卓720*1280界面尺寸规范参考