pytorch小记(四):pytorch中的重排操作:x.permute()

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))
      • 总结

在 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() 的核心就是重新排列维度,保持数据本身不变。通过指定新维度的顺序,可以调整张量的形状和访问方式,用于数据处理和模型输入等场景。

相关推荐
GinoInterpreter1 小时前
什么是翻译的去中心化?
人工智能·自然语言处理·去中心化·区块链·机器翻译·机器翻译模型·机器翻译引擎
zyq99101_11 小时前
优化二分查找:前缀和降复杂度
数据结构·python·蓝桥杯
qyzm1 小时前
天梯赛练习(3月13日)
开发语言·数据结构·python·算法·贪心算法
码农小白AI1 小时前
IACheck AI报告文档审核:高端制造合规新助力,保障标准引用报告质量
大数据·人工智能·制造
_YiFei2 小时前
哪个降论文AI率工具最好用?
人工智能·深度学习·神经网络
放下华子我只抽RuiKe52 小时前
机器学习全景指南-直觉篇——基于距离的 K-近邻 (KNN) 算法
人工智能·gpt·算法·机器学习·语言模型·chatgpt·ai编程
kisshuan123962 小时前
[特殊字符]【深度学习】DA3METRIC-LARGE单目深度估计算法详解
人工智能·深度学习·算法
sali-tec2 小时前
C# 基于OpenCv的视觉工作流-章33-Blod分析
图像处理·人工智能·opencv·算法·计算机视觉
老星*2 小时前
Trae-cn一句话安装OpenClaw:AI智能体框架快速部署指南
人工智能·编辑器
昨夜见军贴06162 小时前
IACheck结合AI报告审核:轨道扣件横向阻力检测报告确保无误差
人工智能