Pytorch学习(2):Tensor的维度变换


前言

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值