pytorch小记(四):pytorch中的重排操作:x.permute()
-
-
- [1. 初始张量 `x`](#1. 初始张量
x
) - [2. 调用 `permute` 的原理](#2. 调用
permute
的原理) - 案例分析
-
- [2.1 `z = x.permute(0, 2, 1)`](#2.1
z = x.permute(0, 2, 1)
) - [2.2 `z = x.permute(1, 0, 2)`](#2.2
z = x.permute(1, 0, 2)
) - [2.3 `z = x.permute(1, 2, 0)`](#2.3
z = x.permute(1, 2, 0)
) - [2.4 `z = x.permute(2, 0, 1)`](#2.4
z = x.permute(2, 0, 1)
) - [2.5 `z = x.permute(2, 1, 0)`](#2.5
z = x.permute(2, 1, 0)
)
- [2.1 `z = x.permute(0, 2, 1)`](#2.1
- 总结
- [1. 初始张量 `x`](#1. 初始张量
-
在 PyTorch 中,permute
是一种对张量维度重新排列的方法。它不会更改数据,而是根据指定的顺序交换维度的位置。
1. 初始张量 x
代码:
python
x = torch.arange(6).reshape(1, 2, 3)
print(x)
输出:
tensor([[[0, 1, 2],
[3, 4, 5]]])
x
的形状是(1, 2, 3)
:- 第 0 维:长度为 1,对应的是最外层的维度(块)。
- 第 1 维:长度为 2,对应的是行数。
- 第 2 维:长度为 3,对应的是列数。
2. 调用 permute
的原理
permute
的参数是新维度的顺序。- 每个参数表示原始维度的索引,
permute(a, b, c)
意味着:- 原第
a
维变为新第 0 维。 - 原第
b
维变为新第 1 维。 - 原第
c
维变为新第 2 维。
- 原第
具体计算时,张量的内容 不变,只是维度排列的方式发生了变化。
案例分析
2.1 z = x.permute(0, 2, 1)
代码:
python
z = x.permute(0, 2, 1)
print(z)
解释:
permute(0, 2, 1)
表示:- 第 0 维保持不变。
- 第 2 维变为第 1 维。
- 第 1 维变为第 2 维。
原张量:
x = [[[0, 1, 2],
[3, 4, 5]]]
# 第 0 维:行 ([[0, 1, 2], [3, 4, 5]])
# 第 1 维:行 ([0, 1, 2], [3, 4, 5])
# 第 2 维:列 ([0, ..., 3], [1, ..., 4], [2, ..., 5])
调整后张量:
- 第 0 维(块):仍为
[[0, 1, 2], [3, 4, 5]]
。 - 第 1 维:原来的列
[0, ..., 3]
,[1, ..., 4]
和[2, ..., 5]
变为行。 - 第 2 维:原来的行
[0, 1, 2]
和[3, 4, 5]
变为列。
结果:
tensor([[[0, 3],
[1, 4],
[2, 5]]])
2.2 z = x.permute(1, 0, 2)
代码:
python
z = x.permute(1, 0, 2)
print(z)
解释:
permute(1, 0, 2)
表示:- 第 1 维变为第 0 维。
- 第 0 维变为第 1 维。
- 第 2 维保持不变。
原张量:
x = [[[0, 1, 2],
[3, 4, 5]]]
# 第 0 维:行 ([[0, 1, 2], [3, 4, 5]])
# 第 1 维:行 ([0, 1, 2], [3, 4, 5])
# 第 2 维:列 ([0, ..., 3], [1, ..., 4], [2, ..., 5])
结果:
tensor([[[0, 1, 2]],
[[3, 4, 5]]])
- 第 0 维(原第 1 维):行数变成了最外层维度。
- 第 1 维(原第 0 维):长度为 1。
- 第 2 维保持不变。
2.3 z = x.permute(1, 2, 0)
代码:
python
z = x.permute(1, 2, 0)
print(z)
解释:
permute(1, 2, 0)
表示:- 第 1 维变为第 0 维。
- 第 2 维变为第 1 维。
- 第 0 维变为第 2 维。
原张量:
x = [[[0, 1, 2],
[3, 4, 5]]]
# 第 0 维:行 ([[0, 1, 2], [3, 4, 5]])
# 第 1 维:行 ([0, 1, 2], [3, 4, 5])
# 第 2 维:列 ([0, ..., 3], [1, ..., 4], [2, ..., 5])
结果:
tensor([[[0],
[1],
[2]],
[[3],
[4],
[5]]])
- 第 0 维(原第 1 维):行数变成了最外层维度。
- 第 1 维(原第 2 维):列数变成了行。
- 第 2 维(原第 0 维):长度为 1。
2.4 z = x.permute(2, 0, 1)
代码:
python
z = x.permute(2, 0, 1)
print(z)
解释:
permute(2, 0, 1)
表示:- 第 2 维变为第 0 维。
- 第 0 维变为第 1 维。
- 第 1 维变为第 2 维。
原张量:
x = [[[0, 1, 2],
[3, 4, 5]]]
# 第 0 维:行 ([[0, 1, 2], [3, 4, 5]])
# 第 1 维:行 ([0, 1, 2], [3, 4, 5])
# 第 2 维:列 ([0, ..., 3], [1, ..., 4], [2, ..., 5])
结果:
tensor([[[0, 3]],
[[1, 4]],
[[2, 5]]])
- 第 0 维(原第 2 维):列数变成最外层维度。
- 第 1 维(原第 0 维):长度为 1。
- 第 2 维(原第 1 维):行数保持不变。
2.5 z = x.permute(2, 1, 0)
代码:
python
z = x.permute(2, 1, 0)
print(z)
解释:
permute(2, 1, 0)
表示:- 第 2 维变为第 0 维。
- 第 1 维保持不变。
- 第 0 维变为第 2 维。
结果:
tensor([[[0],
[3]],
[[1],
[4]],
[[2],
[5]]])
- 第 0 维(原第 2 维):列数变成最外层维度。
- 第 1 维(原第 1 维):行数保持不变。
- 第 2 维(原第 0 维):长度为 1。
总结
x.permute()
的核心就是重新排列维度,保持数据本身不变。通过指定新维度的顺序,可以调整张量的形状和访问方式,用于数据处理和模型输入等场景。