torch.contiguous

作用

连续存储,因为view的操作要求的是连续的内容。

详细

考虑下面的操作,transpose操作只是改变了stride,而实际数组存储的内容并没有得到任何改变,即t是连续存储的 0 1 2 3 4 5 6 7 8 9 10 11 ,t2的实际内容也是一致的,但是其索引的stride改变了,按照该索引去找地址则内存是不连续的。由于pytorch的底层实现是C,也就是行优先存储.由最后输出的faltten后的结果可以看出存储的内容确实改变了,由此完全弄懂了为什么有的时候要contiguous。

>>>t = torch.arange(12).reshape(3,4)
>>>t
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>>t.stride()
(4, 1)
>>>t2 = t.transpose(0,1)
>>>t2
tensor([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
>>>t2.stride()
(1, 4)
>>>t.data_ptr() == t2.data_ptr() # 底层数据是同一个一维数组
True
>>>t.is_contiguous(),t2.is_contiguous() # t连续,t2不连续
(True, False)
>>>print(t1.flatten())
tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>>t2 = t2.contiguous()
>>>print(t2.flatten())
tensor([ 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11])

应用

shuffleNet里打乱channel的操作

def shuffle_channels(x,groups):
batch_size,channels,height,width = x.size()
assert channels % groups == 0
channels_per_group = channels // groups
x = x.view(batch_size,groups,channels_per_group,height,width)
x = x.transpose(1,2).contiguous()
x = x.view(batch_size,channels,height,width)
return x

最新文章

  1. Hello Blog
  2. 【前端攻略】最全面的水平垂直居中方案与flexbox布局
  3. 移动应用开发过程中需要哪些IOS APP工具
  4. CSS hack 和 IE浏览器条件判断 集中汇总
  5. iOS 开发——实用技术Swift篇&Swift 懒加载(lazy)
  6. 在Java中如何用String类中的indexof方法得到一个词的出现频率
  7. C#查询当前微信自定义菜单结构
  8. linux文件权限详解
  9. JS中Node节点总结
  10. Windows下设置 ssh key,配置GitHub ssh key
  11. C++对象模型的那些事儿之一:对象模型(上)
  12. 前端入门23-CSS预处理器(Less&Sass)
  13. Vue2.x路由的步骤
  14. C语言学习书单
  15. 思考与算法:大脑是cpu、思考是算法
  16. ESXi 更新补丁 暂时未测试 等有时间尝试一下.
  17. kswapd0 进程CPU占用过高
  18. cakePHP 分页栏
  19. JavaScript数字转字符串,字符串转数字
  20. cbv

热门文章

  1. LightOJ - 1234 LightOJ - 1245 Harmonic Number(欧拉系数+调和级数)
  2. Debian系统下的ftp服务搭建
  3. MySQL查看版本号的五种方式介绍1111111
  4. 3dmax视频
  5. php 判断手机号运营商
  6. 51nod1102(单调栈/预处理)
  7. jsp学习与提高(三)——JSP Cookie 处理
  8. Leetcode:环形链表2
  9. 2019湘潭校赛 G(并查集)
  10. Hive_Hive的数据模型_汇总