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


Posted in Python onJune 18, 2020

二维的情况

先用二维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获取系统默认字符编码的方法
Jun 04 Python
Python找出9个连续的空闲端口
Feb 01 Python
深入理解python try异常处理机制
Jun 01 Python
python自动化测试无法启动谷歌浏览器问题
Oct 10 Python
使用python和pygame制作挡板弹球游戏
Dec 03 Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 Python
python实现猜数游戏
Mar 27 Python
python 3.8.3 安装配置图文教程
May 21 Python
Selenium自动化测试工具使用方法汇总
Jun 12 Python
Python 中如何使用 virtualenv 管理虚拟环境
Jan 21 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
Mar 03 Python
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
May 12 Python
Python Switch Case三种实现方法代码实例
Jun 18 #Python
Python3开发环境搭建详细教程
Jun 18 #Python
Python collections.defaultdict模块用法详解
Jun 18 #Python
python实现批量命名照片
Jun 18 #Python
pandas之分组groupby()的使用整理与总结
Jun 18 #Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
Jun 18 #Python
Python调用shell cmd方法代码示例解析
Jun 18 #Python
You might like
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
2007/02/22 PHP
用PHP读取flv文件的播放时间长度
2009/09/03 PHP
PHP学习笔记之二
2011/01/17 PHP
PHP缓存技术的使用说明
2011/08/06 PHP
基于Linux调试工具strace与gdb的常用命令总结
2013/06/03 PHP
PHP实现多关键字加亮功能
2016/10/21 PHP
PHP计算近1年的所有月份
2017/03/13 PHP
PHP实现微信提现功能
2018/09/30 PHP
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
用jquery方法操作radio使其默认选项是否
2013/09/10 Javascript
jquery实现图片左右切换的方法
2015/05/07 Javascript
javascript常用方法总结
2015/05/14 Javascript
jQuery实现返回顶部效果的方法
2015/05/29 Javascript
解析如何利用iframe标签以及js制作时钟
2016/12/08 Javascript
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
浅谈js的解析顺序 作用域 严格模式
2017/10/23 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
深入Python函数编程的一些特性
2015/04/13 Python
简单谈谈python的反射机制
2016/06/28 Python
python实现爬取图书封面
2018/07/05 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
2020/12/09 Python
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
New Balance俄罗斯官方网上商店:购买运动鞋
2020/03/02 全球购物
Linux文件系统类型
2012/02/15 面试题
自主招生自荐信
2013/12/08 职场文书
驾驶员安全责任书范本
2014/07/24 职场文书
党的群众路线教育实践活动个人剖析材料
2014/10/07 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
党风廉正建设个人工作总结
2015/03/06 职场文书
银行岗位培训心得体会
2016/01/09 职场文书
Java常用函数式接口总结
2021/06/29 Java/Android
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
2021/08/30 Java/Android