以如下 tensor a
为例,展示常用的维度变换操作
python3
>>> a = torch.rand(4,3,28,28)
>>> a.shape
torch.Size([4, 3, 28, 28])
-
view / reshape 两者功能完全相同:
a.view(shape)
python3>>> a.view(4,3,28*28) ## a.view(4,3,28,28) 可恢复
-
squeeze / unsqueeze:
a.unsqueeze(dim)
,a.squeeze(dim)
只能挤压1 维度
的python3>>> a.unsqueeze(0).shape ## a.squeeze(0) 可恢复 torch.Size([1, 4, 3, 28, 28])
-
transpose / permute:
.t()
只能用于二维矩阵python3>>> a.transpose(0,1).shape ## 两两交换:交换 0 1 维度 torch.Size([3, 4, 28, 28]) >>> a.permute(0,1,2,3).shape ## 新置维度,非两两交换,更方便 torch.Size([4, 3, 28, 28])
-
expand / repeat 两者效果完全相同
expand
高效更推荐python3>>> a.unsqueeze(0).expand(2,4,3,28,28).shape # 只能拓展 1 维度的 torch.Size([2, 4, 3, 28, 28]) >>> a.unsqueeze(0).repeat(2,1,1,1,1).shape # 不是填目标维度,而是填每个维度的重复次数 torch.Size([2, 4, 3, 28, 28])
-
broadcasting 自动扩张:基于已有的小维度的值
自动
进行广播拓展
python3>>> b = a+torch.tensor(1) >>> b.shape torch.Size([4, 3, 28, 28])