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