前言
Pytorch学习笔记第二篇,关于Tensor的维度变换。
正文
1.view/reshape
view和reshape的功能一致,在元素总数不变的情况下改变Tensor的形状,并且可以用-1作为缺省,实现对某一维度的自动计算。
示例:
sample=torch.ones([4,2,3,4])
#维度变换
#1 view/reshape 打平,保持个数不变改变形状
a=sample.view(4,3,2,4)
b=sample.reshape(-1,12) #view和reshape都可以用-1默认其中一个维度(自动计算)
#但view一般无法恢复高维(不储存高维信息的话)
2.squeeze/unsqueeze
squeeze挤压,减少维度;unsqueeze展开,增加维度。
squeeze用于对维度值为1的维度进行挤压,可以指定index,默认情况下挤压去所有1维度,保证元素个数不变。
unsqueeze相反,可以增加1维度,指定的index为增加维度后的新维度index。
示例:
#2 squeeze&unsqueeze 挤压[减少维度]&展开[增加维度]
#unsqueeze
c=sample.unsqueeze(0) #在[0]处增加维度,新维度在新Tensor上索引为[0],[4,2,3,4]->[1,4,2,3,4]
#可用于增加Bias,如下
d=torch.rand(3)
img=torch.rand(4,3,32,32)
d=d.unsqueeze(0).unsqueeze(2).unsqueeze(3) #[3]->[1,3,1,1]
#squeeze 删减1维度,默认情况下全删去,可指定index删除(只能删除1)
d.squeeze() #[1,3,1,1]->[3]
d.squeeze(0) #[1,3,1,1]->[3,1,1]
3.expand/repeat
expand和repeat有所区别,但结果一致。最终都可以扩展Tensor(以复制的形式)。
扩展的Tensor维度会复制该维度原有的元素信息,而对于该维度填写-1代表不变。
示例:
#3 expand/repeat 扩展
#expand要求dim一致,可实现[1,3,1,1]->[4,3,32,32]
e=torch.rand(1,3,1,1)
e=e.expand(4,3,32,32) #填-1代表该维度不变
#repeat填入的是维度拷贝次数
f=torch.rand(1,3,1,1)
f=f.repeat(1,2,3,4) #[1,3,1,1]->[1,6,3,4]
4.t/transpose 转置
t只适用于二维矩阵转置。
transpose适用于任意转置,将输入的两个维度进行交换。
另:转置后往往内存排列不连续,可以使用contiguous进行整理。
示例:
#4 转置t/transpose
g=torch.rand(2,2)
g.t() #只适用矩阵dim=2
h=torch.rand(3,3,3)
h.transpose(0,2) #第1和第3维进行交换
h.transpose(0,2).contiguous() #保证排列连续
5.permute 任意维交换
对于多维交换permute会比transpose方便不少,他直接输入原索引在新索引的位置,从而交换维度,不需要复杂的多次两两交换。
示例:
#5 permute
j=torch.rand(1,3,24,32) #[1,3,24,32]
#目的[1,3,24,32]->[1,24,32,3]
#5.1
j1=j.transpose(1,3).contiguous()
j2=j1.transpose(1,2).contiguous()
#5.2 permute(输入原索引在新索引的位置)
j3=j.permute(0,2,3,1).contiguous()
总结
Tensor的维度交换对于Bias,图片格式转变都有重要意义,希望自己能熟练掌握。
2021.2.18