参考来源:
CSDN:pytorch中torch.transpose() 与 torch.tensor.permute() 的区别
CSDN:pytorch —- tensor.permute() 和 torch.transpose()
博客园:PyTorch 两大转置函数 transpose() 和 permute()
1. tensor.permute(dim1, dim2, dim3, …)
permute
可以对任意高维矩阵进行转置。但只有 tensor.permute()
这个调用方式:
x = torch.rand(2,3,4)
print("x.shape:", x.shape)
x = x.permute(2,1,0)
print("x.shape:", x.shape)
"""
输出:
x.shape: torch.Size([2, 3, 4])
x.shape: torch.Size([4, 3, 2])
[Finished in 1.0s]
"""
例 2:
t.rand(2,3,4,5).permute(3,2,0,1).shape
Out[669]: torch.Size([5, 4, 2, 3])
总结
传入 permute
方法的参数是维度, 未进行变换前的 dim
是 [0, 1, 2]
的方式, 转换后表示将第 0
维度和第 2
维度调换。
2. torch.transpose(input, dim0, dim1, out=None)
函数返回输入矩阵 input
的转置。交换维度 dim0
和 dim1
。
参数:
input (Tensor)
:输入张量,必填。dim0 (int)
:转置的第一维,默认0
,可选。dim1 (int)
:转置的第二维,默认1
,可选。
transpose
只能操作 2D
矩阵的转置(就是每次 transpose
只能在两个维度之间转换,其他维度保持不变)。
有两种调用方式:tensor.transpose()
和 torch.transpose(tensor, dim1, dim2)
连续使用 transpose
也可实现 permute
的效果
torch.transpose(Tensor, 1, 0)
t.rand(2,3,4,5).transpose(3,0).transpose(2,1).transpose(3,2).shape
Out[672]: torch.Size([5, 4, 2, 3])
t.rand(2,3,4,5).transpose(1,0).transpose(2,1).transpose(3,1).shape
Out[670]: torch.Size([3, 5, 2, 4])
3. tensor.permute() 和 torch.transpose()
相同点:交换张量的维度
不同点:主要区别是 transpose
只能在两个维度之间转换, permute
可以一下转换好几个维度。
- 参数列表:
**torch.transpose(input, dim0, dim1, out=None)**
只能传入两个维度参数,tensor
在这两个维度之间交换。 - 参数列表:
**torch.tensor.permute(dims)**
要求传入所有维度,tensor
按维度排列顺序进行交换。 - 内存:
**torch.transpose(dim1,dim2)**
得到的张量与原张量共享内存,而**torch.tensor.permute(dims)**
不具备这个性质
总结:permute
相比 transpose
更加灵活,transpose
具有共享内存机制。
a=torch.tensor([[[1,2,3],[4,5,6]]])
b=torch.tensor([[[1,2,3],[4,5,6]]])
c=a.transpose(2,1)
c=c.transpose(2,1)
d=b.permute(0,2,1)
d=d.permute(0,1,2)
print(c)
print(a)
print(d)
print(b)
"""
#输出结果为:
tensor([[[1, 2, 3],
[4, 5, 6]]])
tensor([[[1, 2, 3],
[4, 5, 6]]])
tensor([[[1, 4],
[2, 5],
[3, 6]]])
tensor([[[1, 2, 3],
[4, 5, 6]]])
"""