二维tensor
x = torch.arange(1,7).view(2,3)
#tensor[[1,2,3],
# [4,5,6]]
x.permute(1,0)
#tensor[[1,4],
# [2,5],
# [3,6]]
# 二维的permute 类似于矩阵的转置
三维tensor
x = torch.range(1,24).view(2,3,4)
>>> x
tensor([[[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.]],
[[13., 14., 15., 16.],
[17., 18., 19., 20.],
[21., 22., 23., 24.]]])
x.permute(0,2,1)
x.permute(0,2,1) 就是转置操作 ==========》 x[i][j][k]-->x[i][k][j]
x 的值:
tensor([[[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.]],
[[13., 14., 15., 16.],
[17., 18., 19., 20.],
[21., 22., 23., 24.]]])
>>> x.permute(0,2,1) # 类似于转置操作 【2,3,4】-》【2,4,3】
tensor([[[ 1., 5., 9.],
[ 2., 6., 10.],
[ 3., 7., 11.],
[ 4., 8., 12.]],
[[13., 17., 21.],
[14., 18., 22.],
[15., 19., 23.],
[16., 20., 24.]]])
x.permute(0,2,1)
x.permute(0,2,1) ==========》 x[i][j][k]-->x[k][i][j]
x 的值:
tensor([[[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.]],
[[13., 14., 15., 16.],
[17., 18., 19., 20.],
[21., 22., 23., 24.]]])
>>> x.permute(2,0,1) # 【2,3,4】-》【4,2,3】
tensor([[[ 1., 5., 9.],
[13., 17., 21.]], # x[0]
[[ 2., 6., 10.],
[14., 18., 22.]],
[[ 3., 7., 11.],
[15., 19., 23.]],
[[ 4., 8., 12.],
[16., 20., 24.]]])
x.permute(1,0,2)
x.permute(1,0,2) ==========》 x[i][j][k]-->x[j][i][k]
x 的值:
tensor([[[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.]],
[[13., 14., 15., 16.],
[17., 18., 19., 20.],
[21., 22., 23., 24.]]])
>>> x.permute(1,0,2)
tensor([[[ 1., 2., 3., 4.],
[13., 14., 15., 16.]],
[[ 5., 6., 7., 8.],
[17., 18., 19., 20.]],
[[ 9., 10., 11., 12.],
[21., 22., 23., 24.]]])
目标检测过程中最常用的是:src.flatten(2).permute(2, 0, 1)
【其中颜色的不同 代表了特征图中的不同位置。将特征图 进行维度转换,就可以的得到HW * B * C , 是transformer中常见的维度转换操作。这样做后续 分多头注意力的时候 ,是在通道的维度分开 ,每一个 头 处理的是一些通道的特征。】