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

目录
  • 一、前言
  • 二、举例解释
    • 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())

此时参数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)

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

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

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

2行3列==>3行2列

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

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

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

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

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

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

最后行列交换,即转置

三、写在最后

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

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

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

到此这篇关于pytorch中permute()函数用法补充说明的文章就介绍到这了,更多相关pytorch permute()函数用法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • pytorch permute维度转换方法

    permute prediction = input.view(bs, self.num_anchors, self.bbox_attrs, in_h, in_w).permute(0, 1, 3, 4, 2).contiguous() 转置: import torch x = torch.linspace(1, 9, steps=9).view(3, 3) b=x.permute(1,0) print(b) print(b.permute(1,0)) 以上这篇pytorch permute维度

  • PyTorch中permute的用法详解

    permute(dims) 将tensor的维度换位. 参数:参数是一系列的整数,代表原来张量的维度.比如三维就有0,1,2这些dimension. 例: import torch import numpy as np a=np.array([[[1,2,3],[4,5,6]]]) unpermuted=torch.tensor(a) print(unpermuted.size()) # --> torch.Size([1, 2, 3]) permuted=unpermuted.permute(

  • 基于PyTorch的permute和reshape/view的区别介绍

    二维的情况 先用二维tensor作为例子,方便理解. permute作用为调换Tensor的维度,参数为调换的维度.例如对于一个二维Tensor来说,调用tensor.permute(1,0)意为将1轴(列轴)与0轴(行轴)调换,相当于进行转置. In [20]: a Out[20]: tensor([[0, 1, 2], [3, 4, 5]]) In [21]: a.permute(1,0) Out[21]: tensor([[0, 3], [1, 4], [2, 5]]) 如果使用view(

  • PyTorch中permute的基本用法示例

    目录 permute(dims) 附:permute(多维数组,[维数的组合]) 总结 permute(dims) 将tensor的维度换位. 参数:参数是一系列的整数,代表原来张量的维度.比如三维就有0,1,2这些dimension. 例: import torch import numpy    as np a=np.array([[[1,2,3],[4,5,6]]]) unpermuted=torch.tensor(a) print(unpermuted.size())  #  -->  

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

    目录 一.前言 二.举例解释 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

  • pytorch中permute()函数用法实例详解

    目录 前言 三维情况 变化一:不改变任何参数 变化二:1与2交换 变化三:0与1交换 变化四:0与2交换 变化五:0与1交换,1与2交换 变化六:0与1交换,0与2交换 总结 前言 本文只讨论二维三维中的permute用法 最近的Attention学习中的一个permute函数让我不理解 这个光说太抽象 我就结合代码与图片解释一下 首先创建一个三维数组小实例 import torch x = torch.linspace(1, 30, steps=30).view(3,2,5) # 设置一个三维

  • pytorch中Parameter函数用法示例

    目录 用法介绍 代码介绍 用法介绍 pytorch中的Parameter函数可以对某个张量进行参数化.它可以将不可训练的张量转化为可训练的参数类型,同时将转化后的张量绑定到模型可训练参数的列表中,当更新模型的参数时一并将其更新. torch.nn.parameter.Parameter data (Tensor):表示需要参数化的张量 requires_grad (bool, optional):表示是否该张量是否需要梯度,默认值为True 代码介绍  pytorch中的Parameter函数具

  • 基于PyTorch中view的用法说明

    相当于numpy中resize()的功能,但是用法可能不太一样. 我的理解是: 把原先tensor中的数据按照行优先的顺序排成一个一维的数据(这里应该是因为要求地址是连续存储的),然后按照参数组合成其他维度的tensor. 比如说是不管你原先的数据是[[[1,2,3],[4,5,6]]]还是[1,2,3,4,5,6],因为它们排成一维向量都是6个元素,所以只要view后面的参数一致,得到的结果都是一样的. 比如, a=torch.Tensor([[[1,2,3],[4,5,6]]]) b=tor

  • PyTorch中topk函数的用法详解

    听名字就知道这个函数是用来求tensor中某个dim的前k大或者前k小的值以及对应的index. 用法 torch.topk(input, k, dim=None, largest=True, sorted=True, out=None) -> (Tensor, LongTensor) input:一个tensor数据 k:指明是得到前k个数据以及其index dim: 指定在哪个维度上排序, 默认是最后一个维度 largest:如果为True,按照大到小排序: 如果为False,按照小到大排序

  • pytorch 中pad函数toch.nn.functional.pad()的用法

    padding操作是给图像外围加像素点. 为了实际说明操作过程,这里我们使用一张实际的图片来做一下处理. 这张图片是大小是(256,256),使用pad来给它加上一个黑色的边框.具体代码如下: import torch.nn,functional as F import torch from PIL import Image im=Image.open("heibai.jpg",'r') X=torch.Tensor(np.asarray(im)) print("shape:

  • 基于pytorch中的Sequential用法说明

    class torch.nn.Sequential(* args) 一个时序容器.Modules 会以他们传入的顺序被添加到容器中.当然,也可以传入一个OrderedDict. 为了更容易的理解如何使用Sequential, 下面给出了一个例子: # Example of using Sequential model = nn.Sequential( nn.Conv2d(1,20,5), nn.ReLU(), nn.Conv2d(20,64,5), nn.ReLU() ) # Example o

  • pytorch中的weight-initilzation用法

    pytorch中的权值初始化 官方论坛对weight-initilzation的讨论 torch.nn.Module.apply(fn) torch.nn.Module.apply(fn) # 递归的调用weights_init函数,遍历nn.Module的submodule作为参数 # 常用来对模型的参数进行初始化 # fn是对参数进行初始化的函数的句柄,fn以nn.Module或者自己定义的nn.Module的子类作为参数 # fn (Module -> None) – function t

随机推荐