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

 更新时间:2020年06月18日 09:51:06   作者:pyxiea  
这篇文章主要介绍了基于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(3,2)或reshape(3,2),得到的tensor并不是转置的效果,而是相当于将原tensor的元素按行取出,然后按行放入到新形状的tensor中。

In [22]: a.reshape(3,2) 
Out[22]:    
tensor([[0, 1],   
  [2, 3],   
  [4, 5]])  
      
In [23]: a.view(3,2) 
Out[23]:    
tensor([[0, 1],   
  [2, 3],   
  [4, 5]]) 

高维的情况

一般使用permute的情况都是在更高维的情况下使用,例如对于一个图像batch,其形状为[batch, channel, height, width],我们可以使用tensor.permute(0,3,2,1)得到形状为[batch, width, height, channel]的tensor.

我们构造一个模拟的batch用于演示。

In [25]: a=torch.arange(2*3*2*1).reshape(2,3,2,1) 
             
In [26]: a          
Out[26]:           
tensor([[[[ 0],    # 这是第0张“图片”的第0号通道的2个元素      
   [ 1]],         
             
   [[ 2],    # 这是第0张“图片”的第1号通道的2个元素      
   [ 3]],         
             
   [[ 4],    # 这是第0张“图片”的第2号通道的2个元素      
   [ 5]]],         
             
             
  [[[ 6],         
   [ 7]],         
             
   [[ 8],         
   [ 9]],         
             
   [[10],         
   [11]]]]) 

a的形状为[2,3,2,1],这个batch有2张“图片”,每张图片有3个通道,每个通道为2x1,例如第0张图片的第0号通道为[[0], [1]].

In [27]: a.permute(0,3,2,1)
Out[27]:
tensor([[[[ 0, 2, 4],
   [ 1, 3, 5]]],


  [[[ 6, 8, 10],
   [ 7, 9, 11]]]])
In [28]: a.permute(0,3,2,1).shape
Out[28]: torch.Size([2, 1, 2, 3])

形状为[2,3,2,1]的batch执行permute(0,3,2,1)交换维度之后,得到的是[2,1,2,3],即[batch, width, height, channel]

可以理解为,对于一个高维的Tensor执行permute,我们没有改变数据的相对位置,而只是旋转了一下这个(超)立方体。或者也可以说,改变了我们对这个(超)立方体的“观察角度”而已。

补充知识:pytorch: torch.Tensor.view ------ reshape

如下所示:

torch.Tensoe.view(python method, in torch.Tensor)

作用: 将输入的torch.Tensor改变形状(size)并返回.返回的Tensor与输入的Tensor必须有相同的元素,相同的元素数目,但形状可以不一样

即,view起到的作用是reshape,view的参数的是改变后的shape.

示例如下:

>>> x = torch.randn(4, 4)
>>> x.size()
torch.Size([4, 4])
>>> y = x.view(16)
>>> y.size()
torch.Size([16])
>>> z = x.view(-1, 8) # the size -1 is inferred from other dimensions
>>> z.size()
torch.Size([2, 8])

view_as:

tensor_1.view_as(tensor_2):将tensor_1的形状改成与tensor_2一样

以上这篇基于PyTorch的permute和reshape/view的区别介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解Python中行列式的计算

    详解Python中行列式的计算

    矩阵的行列式是仅与方阵相关的标量, 这篇文章主要为大家详细介绍了如何利用Python实现行列式的计算,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • 用Python进行简单图像识别(验证码)

    用Python进行简单图像识别(验证码)

    这篇文章主要为大家详细介绍了用Python进行简单图像识别验证码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Pycharm+Python+PyQt5使用详解

    Pycharm+Python+PyQt5使用详解

    这篇文章主要介绍了Pycharm+Python+PyQt5使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 一文详解pygame.sprite的精灵碰撞

    一文详解pygame.sprite的精灵碰撞

    精灵其实在一个游戏程序中,精灵本质指的是一张张小尺寸的图片,比如游戏中的各种道具、人物、场景装饰等,它们都可以看做成一张张小的“精灵”图,下面这篇文章主要给大家介绍了关于pygame.sprite精灵碰撞的相关资料,需要的朋友可以参考下
    2023-01-01
  • python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境

    python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境

    这篇文章主要介绍了python 通过pip freeze、dowload打离线包及自动安装【适用于保密的离线环境】,本文通图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Python3简单实现串口通信的方法

    Python3简单实现串口通信的方法

    今天小编就为大家分享一篇Python3简单实现串口通信的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • 解决pytorch 损失函数中输入输出不匹配的问题

    解决pytorch 损失函数中输入输出不匹配的问题

    这篇文章主要介绍了解决pytorch 损失函数中输入输出不匹配的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Pycharm中无法使用pip安装的包问题解决方案

    Pycharm中无法使用pip安装的包问题解决方案

    本文主要介绍了Pycharm中无法使用pip安装的包问题解决方案,在终端通过pip装好包以后,在pycharm中导入包时,依然会报错,下面就来介绍一下解决方法
    2023-09-09
  • python 将列表里的字典元素合并为一个字典实例

    python 将列表里的字典元素合并为一个字典实例

    这篇文章主要介绍了python 将列表里的字典元素合并为一个字典实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Pytest实现setup和teardown的详细使用详解

    Pytest实现setup和teardown的详细使用详解

    这篇文章主要介绍了Pytest实现setup和teardown的详细使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论