基于PyTorch中view的用法说明


Posted in Python onMarch 03, 2021

相当于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=torch.Tensor([1,2,3,4,5,6])
print(a.view(1,6))
print(b.view(1,6))

得到的结果都是

tensor([[1., 2., 3., 4., 5., 6.]])

再看一个例子:

a=torch.Tensor([[[1,2,3],[4,5,6]]])
print(a.view(3,2))

将会得到:

tensor([[1., 2.],
    [3., 4.],
    [5., 6.]])

相当于就是从1,2,3,4,5,6顺序的拿数组来填充需要的形状。但是如果您想得到如下的结果:

tensor([[1., 4.],
    [2., 5.],
    [3., 6.]])

就需要使用另一个函数了:permute()。用法参见我的另一篇博客:PyTorch中permute的用法

另外,参数不可为空。参数中的-1就代表这个位置由其他位置的数字来推断,只要在不致歧义的情况的下,view参数就可以推断出来,也就是人可以推断出形状的情况下,view函数也可以推断出来。

比如a tensor的数据个数是6个,如果view(1,-1),我们就可以根据tensor的元素个数推断出-1代表6。

而如果是view(-1,-1,2),人不知道怎么推断,机器也不知道。

还有一种情况是人可以推断出来,但是机器推断不出来的:view(-1,-1,6),人可以知道-1都代表1,但是机器不允许同时有两个负1。

如果没有-1,那么所有参数的乘积就要和tensor中元素的总个数一致了,否则就会出现错误。

补充:pytorch中x.view()和permute用法

pytorch中x.view()用法

在pytorch中经常会看到x.view(),它表示将Tensor的维度转变为view指定的维度,有点类似于resize函数

b=torch.Tensor([[[[1,2,3],[4,5,6],[7,8,9]],[[1,2,3],[4,5,6],[7,8,9]]]])
print(b.size())
(1, 2, 3, 3)
print(b.view(b.size(0),-1))
tensor([[1., 2., 3., 4., 5., 6., 7., 8., 9., 1., 2., 3., 4., 5., 6., 7., 8., 9.]])
print(b.view(b.size(0),-1).size())
(1, 18)

b.size(0)表示b中0维度==1,-1是按照原数据自动分配的列数。

a=torch.Tensor([[[1,2,3],[4,5,6]]])
print(a.size())
(1, 2, 3)
print(a.view(6,-1))
tensor([[1.],
[2.],
[3.],
[4.],
[5.],
[6.]])
print(a.view(6,-1).size())
(6, 1)

将a转变成6行1列

print(a.view(-1,6).size())
(1, 6)

或者将a转变成1行6列

在程序里还经常见到view函数后面跟着permute()函数,这个函数是做维度换位的

print(a.view(-1,6).permute(1,0))
tensor([[1.],
[2.],
[3.],
[4.],
[5.],
[6.]])
print(a.view(-1,6).permute(1,0).size())
(6, 1)

加了permute,a就由(1,6)变成(6,1)了。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Python 相关文章推荐
Python的消息队列包SnakeMQ使用初探
Jun 29 Python
python使用正则表达式替换匹配成功的组
Nov 17 Python
Python 和 JS 有哪些相同之处
Nov 23 Python
Python实现进程同步和通信的方法
Jan 02 Python
python pexpect ssh 远程登录服务器的方法
Feb 14 Python
在Python中表示一个对象的方法
Jun 25 Python
python中bs4.BeautifulSoup的基本用法
Jul 27 Python
Python实现图片批量加入水印代码实例
Nov 30 Python
python批量替换文件名中的共同字符实例
Mar 05 Python
Anconda环境下Vscode安装Python的方法详解
Mar 29 Python
Python基于traceback模块获取异常信息
Jul 23 Python
Python数据分析之pandas读取数据
Jun 02 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
Mar 03 #Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
Mar 03 #Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
Mar 03 #Python
Pytorch 中的optimizer使用说明
Mar 03 #Python
解决pytorch 的state_dict()拷贝问题
Mar 03 #Python
解决pytorch 保存模型遇到的问题
Mar 03 #Python
解决pytorch 模型复制的一些问题
Mar 03 #Python
You might like
透析PHP的配置文件php.ini
2006/10/09 PHP
php HtmlReplace输入过滤安全函数
2010/07/03 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
PHP代码实现表单数据验证类
2015/07/28 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
jquery 注意事项与常用语法小结
2010/06/07 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
Extjs根据条件设置表格某行背景色示例
2014/07/23 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
2014/12/18 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
2016/11/01 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
js仿微博动态栏功能
2017/02/22 Javascript
Angular.js自动化测试之protractor详解
2017/07/07 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
2018/09/06 jQuery
JS+HTML5 canvas绘制验证码示例
2018/12/05 Javascript
ES6 Symbol在对象中的作用实例分析
2020/06/06 Javascript
[51:15]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-GAMING
2014/05/22 DOTA
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python函数学习笔记
2008/10/07 Python
python实现simhash算法实例
2014/04/25 Python
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
解决DataFrame排序sort的问题
2018/06/07 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
TensorFlow-gpu和opencv安装详细教程
2020/06/30 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
利用python实现汉诺塔游戏
2021/03/01 Python
js实现弹框效果
2021/03/24 Javascript
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
内勤岗位职责范本
2015/04/13 职场文书
学习十八大的感悟
2015/08/11 职场文书
校运会广播稿
2015/08/19 职场文书
学习委员竞选稿
2015/11/20 职场文书
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android