Tensor形状改变 pytorch pytorch改变tensor维度

您所在的位置:网站首页 tensor的梯度形状 Tensor形状改变 pytorch pytorch改变tensor维度

Tensor形状改变 pytorch pytorch改变tensor维度

2023-06-28 13:42| 来源: 网络整理| 查看: 265

文章目录前言正文1.view/reshape2.squeeze/unsqueeze3.expand/repeat4.t/transpose 转置5.permute 任意维交换总结

前言

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,图片格式转变都有重要意义,希望自己能熟练掌握。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3