【Pytorch】各种维度变换函数总结

维度变换千万不要混着用,尤其是交换维度的transpose和更改观察视角的view或者reshape!混用了以后虽然不会报错,但是数据是乱的, 建议用einops中的rearrange,符合人的直观,不容易出错。
一个例子:

>>>t
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
>>> t.transpose(0,1)	# 交换t的前两个维度,即对t进行转置。
tensor([[ 0,  4,  8],
        [ 1,  5,  9],
        [ 2,  6, 10],
        [ 3,  7, 11]])
>>> a.reshape(4,3)     # 使用reshape()/view()的方法,虽然形状一样,但是数据排列完全不同
tensor([[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]])
        
>>> from einops import rearrange
>>> rearrange(t, 'r c -> c r')
tensor([[ 0,  4,  8],
        [ 1,  5,  9],
        [ 2,  6, 10],
        [ 3,  7, 11]])

下面是转载的这篇文章:PyTorch各种维度变换函数总结,侵删

介绍

本文对于PyTorch中的各种维度变换的函数进行总结,包括reshape()view()resize_()transpose()permute()squeeze()unsqeeze()expand()repeat()函数的介绍和对比。

contiguous

区分各个维度转换函数的前提是需要了解contiguous。在PyTorch中,contiguous指的是Tensor底层一维数组的存储顺序和其元素顺序一致

Tensor是以一维数组的形式存储的,C/C++使用行优先(按行展开)的方式,Python中的Tensor底层实现使用的是C,因此PyThon中的Tensor也是按行展开存储的,如果其存储顺序按行优先展开的一维数组元素顺序一致,就说这个Tensor是连续(contiguous)的。

形式化定义:

对于任意的 d d d 维张量 t t t ,如果满足对于所有的 i i i ,第 i i i 维相邻元素间隔=第 i + 1 i+1 i+1 维相邻元素间隔 × \times × i + 1 i+1 i+1 维长度的乘积,则 t t t 是连续的:
 stride  [ i ] =  stride  [ i + 1 ] × size ⁡ [ i + 1 ] , ∀ i = 0 , … , d − 1 ( i ≠ d − 1 ) \text { stride }[i]=\text { stride }[i+1] \times \operatorname{size}[i+1], \forall i=0, \ldots, d-1(i \neq d-1)  stride [i]= stride [i+1]×size[i+1],i=0,,d1(i

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值