最近遇到这个函数,但查的中文博客里的解释貌似不是很到位,这里翻译一下stackoverflow上的回答并加上自己的理解。

在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

可以看到,改变了y的元素的值的同时,x的元素的值也发生了变化。

也就是说,经过上述操作后得到的tensor,它内部数据的布局方式和从头开始创建一个这样的常规的tensor的布局方式是不一样的!于是…这就有contiguous()的用武之地了。

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

当调用contiguous()时,会强制拷贝一份tensor,让它的布局和从头创建的一毛一样。

一般来说这一点不用太担心,如果你没在需要调用contiguous()的地方调用contiguous(),运行时会提示你:

RuntimeError: input is not contiguous

只要看到这个错误提示,加上contiguous()就好啦~

Pytorch中的contiguous理解相关推荐

  1. pytorch中repeat()函数理解

    pytorch中repeat()函数理解 最近在学习过程中遇到了repeat()函数的使用,这里记录一下自己对这个函数的理解. 情况1:repeat参数个数与tensor维数一致时 a = torch ...

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

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

  3. pytorch中的contiguous()

    pytorch中的contiguous() 1 先看看官方中英文doc: torch.Tensor.contiguous (Python method, in torch.Tensor) torch. ...

  4. Pytorch中的contiguous()函数

    这个函数主要是为了辅助pytorch中的一些其他函数,主要包含 在PyTorch中,有一些对Tensor的操作不会真正改变Tensor的内容,改变的仅仅是Tensor中字节位置的索引.这些操作有: n ...

  5. pytorch中的contiguous()函数的浅浅解释

    contiguous() 有些tensor并不是占用一整块内存,而是由不同的数据块组成. contiguous()函数的作用:把tensor变成在内存中连续分布的形式. 来自链接一 contiguou ...

  6. PyTorch中的contiguous解读

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

  7. 详解PyTorch中的contiguous

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

  8. pytorch中的contiguous

    contigous 在英文中为 连续的意思,何为连续,就是语义相同的张量存储在连续的内存空间中, 为什么要使用contigous? 因为view()操作需要连续的tensor transpose.pe ...

  9. Pytorch中dim的理解

    dim的定义 dim 表示维度 x = torch.randn(2, 3, 3)print(x) print(x.size()) print(x.dim()) 输出: tensor([[[-1.694 ...

最新文章

  1. PreTranslateMessage作用和用法
  2. 建站常用13种PHP开源CMS比较
  3. 问题集锦(30-35)
  4. 单机运行环境搭建之 --CentOS-6.4安装MySQL 5.6.10并修改MySQL的root用户密码
  5. 生成随机长度字符串,比如密码等
  6. for in for of区别_Python 第5课:for…in循环黄金搭档之列表
  7. (二分+区间搜索 )Mountain Walking(poj2110/poj2922)
  8. ApacheCN/iBooker 未来计划 2019.11
  9. web开发 开发一个能发送邮件的应用
  10. 如何使用sklearn进行数据挖掘?
  11. 微型计算机工作最小时间单位,2010~2011学年第1学期微机原理2试卷A(答案)
  12. 左程云算法课基础06图课程笔记
  13. python 批量视频转换成图片
  14. JavaScript Web APIs
  15. uboot启动流程详细分析(基于i.m6ull)
  16. R语言 image.binarization: 包_想提高文章的引用率?写个R包吧!- 工具准备篇
  17. 【转载】PyCharm 或者其他 Idea 官网打不开解决办法:
  18. 深圳高中女生街头版someone like you
  19. DNS解析为什么不生效?DNS解析不生效原因分析
  20. 用Python画中国地图,实现各省份数据可视化!可视化简直了!

热门文章

  1. Nginx简介【重点】
  2. mySQL实现redis_Redis同步mysql实现解决方案
  3. 如果是狗,也要做一直战斗狗--三十岁的程序员
  4. c语言生日创意代码_生日日数 (C语言代码)
  5. 快捷方式管理程序(网吧游戏菜单) SQLite本地数据库
  6. Oracle中保留两位小数
  7. 【项目实战】- 基于SpringBoot+WebScoket+Vue+ElementUI实现一个网页版地球聊天软件
  8. TYVJ p1006 isbn
  9. 模块加载命令modprobe和insmod区别
  10. vSAN 6.6十大特性的文档和视频