目录
  • 一、前言
  • 二、举例解释
    • 1、permute(0,1,2)
    • 2、permute(0,1,2) ⇒ permute(0,2,1)
    • 3、permute(0,2,1) ⇒ permute(1,0,2)
    • 4、permute(1,0,2) ⇒ permute(0,2,1)
  • 三、写在最后

    一、前言

    之前写了篇torch中permute()函数用法文章,在详细的说一下permute函数里维度变化的详细过程

    非常感谢@m0_46225327对本文案例更加细节补充

    注意:

    本文是这篇torch中permute()函数用法文章的补充内容

    如果有精力可以把这篇文章阅读一下,能够更好的理解函数的维度变化过程

    以及加深对输出结果的印象

    二、举例解释

    这里以比较经典的变化四做例子

    先回顾一下变化四的内容:

    ————————————————分割线——————————————

    变化四:0与2交换

    b = x.permute(2,1,0)            # 交换块和列
    print(b)
    print(b.size())
    

    pytorch中permute()函数用法补充说明(矩阵维度变化过程)

    pytorch中permute()函数用法补充说明(矩阵维度变化过程)

    此时参数0对应的3块经过permute已经变成了5块

    参数2对应的5列已经变成了3列

    ————————————————分割线——————————————

    解释部分

    变化四中permute参数把(0,1,2)交换成了(2,1,0)

    直观上看是直接把0和2两个位置直接交换

    实际上两个参数交换包括了以下部分

    维度变换重点

    维度数值变换:(3,2,5)==>(3,5,2)==>(5,3,2)==>(5,2,3)
    # 读者一定要考虑清楚下一行代表什么意思
    函数中参数变换(0,1,2)==>(0,2,1)==>(1,0,2)==>(0,2,1)
    # 第一个"==>" 变化为2和5交换,对应函数里的参数0不动,1和2交换 ,变换完后为(0,2,1),对应维度是(3,5,2)。重排序为(0,1,2)
    # 第二个"==>" 变化为3和5交换,对应函数里的参数2不动,0和1交换,变换完后为(1,0,2),对应维度是(5,3,2)。重排序为(0,1,2)
    # 第三个"==>" 变化为3和2交换,对应函数里的参数0不动,1和2交换,变换完后为(0,2,1),对应维度是(5,2,3)。重排序为(0,1,2)
    

    或者看表格更容易理解些?

    维度变换过程 维度数值变换 函数参数变换
    (3,2,5) (0,1,2)
    (3,5,2) 2和5 (0,1,2)==> (0,2,1)
    (5,3,2) 3和5 (0,1,2)==>(1,0,2)
    (5,2,3) 3和2 (0,1,2)==>(0,2,1)

    这里先给大家把代码放上来

    便于大家验证理解

    也可以先跳过代码部分直接看图片解释

    import torch
    
    x = torch.linspace(1,30,steps=30).view(3,2,5)
    print('x:',x)
    print(x.size())
    
    # permute(0,1,2)==>permute(2,1,0)
    # (3,2,5)==>(3,5,2)==>(5,3,2)==>(5,2,3)
    #
    # (0,1,2)==>(0,2,1)==>(1,0,2)==>(0,2,1)
    
    b1 = x.permute(0,2,1)
    print('b1:',b1)
    print(b1.size())
    
    b2 = b1.permute(2,0,1)
    print('b2:',b2)
    print(b2.size())
    
    b = b2.permute(2,1,0)
    print('b:',b)
    print(b1.size())

    1、permute(0,1,2)

    pytorch中permute()函数用法补充说明(矩阵维度变化过程)

    这部分就是(3,2,5)矩阵中原有的样子

    2、permute(0,1,2) ⇒ permute(0,2,1)

    pytorch中permute()函数用法补充说明(矩阵维度变化过程)

    这部分是把3块中的每一块矩阵进行转置操作,即行和列的交换

    2行3列==>3行2列

    3、permute(0,2,1) ⇒ permute(1,0,2)

    pytorch中permute()函数用法补充说明(矩阵维度变化过程)

    这部分是列不动,把块和行交换

    把第一块的五行分别写入变换后的五块中第一行

    把第二块的五行分别写入变换后的五块中第二行

    把第三块的五行分别写入变换后的五块中第三行

    4、permute(1,0,2) ⇒ permute(0,2,1)

    pytorch中permute()函数用法补充说明(矩阵维度变化过程)

    最后行列交换,即转置

    三、写在最后

    如果大家看起来还是比较难理解些

    建议可以手写一下这个转换例子,真的一下就懂了

    以下是我手写矩阵转化过程

    pytorch中permute()函数用法补充说明(矩阵维度变化过程)

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。