张量的permute()和transpose()

结论:

permute()和transpose()是按照张量的数组坐标进行转置的,可以理解为我们只是换个角度观察张量,再换一种理解,张量中的维度实际上是数据排列的先后顺序,我们换维度,也就是换数据排列的先后顺序。

一:张量的数据存储

再pytorch中,张量的存储实际上分为两个部分,一部分是张量的头信息,包括张量的shape,stride等。另一部分就是张量数据的实际存储空间,可以使用张量.storage()方法来得到张量存储的数据,sorage()是在data之上封装的一个接口。

参考自:PyTorch 笔记(11)— Tensor内部存储结构(头信息区 Tensor,存储区 Storage)_wohu1104的专栏-CSDN博客_tensor存储结构

二:张量的连续性:contiguous

我们可以通过张量的is_contiguous()方法来判断张量是否连续。

is_contiguous直观的解释是Tensor底层一维数组元素的存储顺序与Tensor按行优先一维展开的元素顺序是否一致。

详细请参考:PyTorch中的contiguous - 知乎 (zhihu.com)

三:view/reshape

view()只能对连续张量进行,其实质是将张量先展开成一维,然后再按照给定的shape进行排列,view()不会创建新的内存空间,我们可以理解为view()是在原始数据上修改了张量的头文件,所以view()其实是对张量的浅拷贝(这里把张量数据的存储相当于列表中的列表)

参考自:permute()和view() - 知乎 (zhihu.com)

pytorch中张量.view()方法_算法程序员&mlh的博客-CSDN博客

reshape() =view()或者 contiguous().view(),reshape可以作用于非连续的张量,其本质是先进行contiguous,再执行view。当张量是连续的时候reshape = view,也就是产生的还是浅拷贝,但是如果是不连续的张量,则reshape() = contiguous().view(),而contiguous是对数据按照其shape进行深拷贝,此时reshape前后的张量不再共享内存中的数据。

四:permute()和transpose()

可以理解为,没有改变张量的结构,只是改变了我们观察张量的角度,比如一个12*24的图,转置以后变成24*12,整个图片是没有改变的,只是改变了我们观察的角度

permute()和transpose()也是浅拷贝,只改变张量的头元信息,而与原张量共享数据,但是通过这两者操作之后的张量不再满足连续性,因为此时张量在内存中的存储位置是没有变化的,但是张量头文件中的stride,shape发生了变化,使得张量按行展开以后不再与其在内存中的存储顺序一样了。所以这个时候只能先使用contiguous对转置后的数据进行深拷贝,并按照转置后的stride在内存中对数据进行重排。变成连续的,之后才可以使用view()

那么permute和transpose是怎么对数据进行维度变换呢?举例如下

验证:

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值