基于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变量和字符串详解
Apr 29 Python
python django 增删改查操作 数据库Mysql
Jul 27 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
Dec 05 Python
django开发post接口简单案例,获取参数值的方法
Dec 11 Python
余弦相似性计算及python代码实现过程解析
Sep 18 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
Jan 14 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
May 18 Python
Python读取Excel数据并生成图表过程解析
Jun 18 Python
Python Unittest原理及基本使用方法
Nov 06 Python
通过实例解析python and和or使用方法
Nov 14 Python
python3处理word文档实例分析
Dec 01 Python
python Zmail模块简介与使用示例
Dec 19 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
PHP中数据类型转换的三种方式
2015/04/02 PHP
PHP如何开启Opcache功能提升程序处理效率
2020/04/27 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
JavaScript中Array 对象相关的几个方法
2006/12/22 Javascript
基于jquery的跨域调用文件
2010/11/19 Javascript
jQuery之end()和pushStack()使用介绍
2012/02/07 Javascript
javascript调试过程中找不到哪里出错的可能原因
2013/12/16 Javascript
JavaScript设计模式之策略模式实例
2014/10/10 Javascript
js点击button按钮跳转到另一个新页面
2014/10/10 Javascript
jQuery中trigger()方法用法实例
2015/01/19 Javascript
javascript实现不同颜色Tab标签切换效果
2016/04/27 Javascript
原生js实现tab选项卡切换
2020/03/23 Javascript
Javascript实现跨域后台设置拦截的方法详解
2017/08/04 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
2017/09/28 Javascript
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
mpvue中配置vuex并持久化到本地Storage图文教程解析
2018/03/15 Javascript
在Vue 中使用Typescript的示例代码
2018/09/10 Javascript
Threejs实现滴滴官网首页地球动画功能
2020/07/13 Javascript
VUE项目axios请求头更改Content-Type操作
2020/07/24 Javascript
[35:55]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.11
2020/12/13 DOTA
python字符串加密解密的三种方法分享(base64 win32com)
2014/01/19 Python
Python中操作符重载用法分析
2016/04/29 Python
5个很好的Python面试题问题答案及分析
2018/01/19 Python
python去掉 unicode 字符串前面的u方法
2018/10/21 Python
对python中字典keys,values,items的使用详解
2019/02/03 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
Python3标准库glob文件名模式匹配的问题
2020/03/13 Python
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
校本教研工作方案
2014/01/14 职场文书
生物制药自我鉴定
2014/01/25 职场文书
优秀驾驶员先进事迹材料
2014/05/04 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
三峡人家导游词
2015/01/31 职场文书
离职证明范本
2015/06/12 职场文书
工资证明格式模板
2015/06/12 职场文书
同事离别感言
2015/08/04 职场文书