基于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 Web开发框架Django
Jun 30 Python
wxPython使用系统剪切板的方法
Jun 16 Python
使用Python多线程爬虫爬取电影天堂资源
Sep 23 Python
python的exec、eval使用分析
Dec 11 Python
python机器学习之神经网络(一)
Dec 20 Python
图解Python变量与赋值
Apr 03 Python
pandas的object对象转时间对象的方法
Apr 11 Python
python爬取网页转换为PDF文件
Jun 07 Python
对Pyhon实现静态变量全局变量的方法详解
Jan 11 Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 Python
Keras load_model 导入错误的解决方式
Jun 09 Python
教你怎么用Python实现多路径迷宫
Apr 29 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 无限极分类
2008/03/27 PHP
PHP伪静态页面函数附使用方法
2008/06/20 PHP
PHP编程实现计算抽奖概率算法完整实例
2017/08/09 PHP
js获取当前select 元素值的代码
2010/04/19 Javascript
JavaScript prototype属性使用说明
2010/05/13 Javascript
javascript是怎么继承的介绍
2012/01/05 Javascript
node.js中的emitter.emit方法使用说明
2014/12/10 Javascript
jQuery操作JSON的CRUD用法实例
2015/02/25 Javascript
使用原生js封装的ajax实例(兼容jsonp)
2017/10/12 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
layui table 参数设置方法
2018/08/14 Javascript
vue展示dicom文件医疗系统的实现代码
2018/08/27 Javascript
微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析
2019/08/16 Javascript
vue实现前端分页完整代码
2020/06/17 Javascript
JavaScript中while循环的基础使用教程
2020/08/11 Javascript
修改Python的pyxmpp2中的主循环使其提高性能
2015/04/24 Python
Python实现输出某区间范围内全部素数的方法
2018/05/02 Python
pandas 对每一列数据进行标准化的方法
2018/06/09 Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
2018/11/23 Python
使用Python画出小人发射爱心的代码
2019/11/23 Python
python实现堆排序的实例讲解
2020/02/21 Python
Python Unittest原理及基本使用方法
2020/11/06 Python
Python开发.exe小工具的详细步骤
2021/01/27 Python
实例讲解利用HTML5 Canvas API操作图形旋转的方法
2016/03/22 HTML / CSS
HTML5中的websocket实现直播功能
2018/05/21 HTML / CSS
EMPHASIS艾斐诗官网:周生生旗下原创精品珠宝品牌
2020/12/17 全球购物
一套SQL笔试题
2016/08/14 面试题
Java基础面试题
2014/07/19 面试题
火车的故事教学反思
2014/02/11 职场文书
C++程序员求职信范文
2014/04/14 职场文书
三月雷锋月活动总结
2014/07/03 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
红歌会主持词
2015/07/02 职场文书
《别在吃苦的年纪选择安逸》读后感3篇
2019/11/30 职场文书
《和时间赛跑》读后感3篇
2019/12/16 职场文书