参考来源:
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).shapeOut[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).shapeOut[672]: torch.Size([5, 4, 2, 3])t.rand(2,3,4,5).transpose(1,0).transpose(2,1).transpose(3,1).shapeOut[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]]])"""
