对Pytorch 中的contiguous理解说明


Posted in Python onMarch 03, 2021

最近遇到这个函数,但查的中文博客里的解释貌似不是很到位,这里翻译一下stackoverflow上的回答并加上自己的理解。

在pytorch中,只有很少几个操作是不改变tensor的内容本身,而只是重新定义下标与元素的对应关系的。换句话说,这种操作不进行数据拷贝和数据的改变,变的是元数据。

这些操作是:

narrow(),view(),expand()和transpose()

举个栗子,在使用transpose()进行转置操作时,pytorch并不会创建新的、转置后的tensor,而是修改了tensor中的一些属性(也就是元数据),使得此时的offset和stride是与转置tensor相对应的。

转置的tensor和原tensor的内存是共享的!

为了证明这一点,我们来看下面的代码:

x = torch.randn(3, 2)
y = x.transpose(x, 0, 1)
x[0, 0] = 233
print(y[0, 0])
# print 233

可以看到,改变了y的元素的值的同时,x的元素的值也发生了变化。

也就是说,经过上述操作后得到的tensor,它内部数据的布局方式和从头开始创建一个这样的常规的tensor的布局方式是不一样的!于是…这就有contiguous()的用武之地了。

在上面的例子中,x是contiguous的,但y不是(因为内部数据不是通常的布局方式)。

注意不要被contiguous的字面意思“连续的”误解,tensor中数据还是在内存中一块区域里,只是布局的问题!

当调用contiguous()时,会强制拷贝一份tensor,让它的布局和从头创建的一毛一样。

一般来说这一点不用太担心,如果你没在需要调用contiguous()的地方调用contiguous(),运行时会提示你:

RuntimeError: input is not contiguous

只要看到这个错误提示,加上contiguous()就好啦~

补充:pytorch之expand,gather,squeeze,sum,contiguous,softmax,max,argmax

gather

torch.gather(input,dim,index,out=None)。对指定维进行索引。比如4*3的张量,对dim=1进行索引,那么index的取值范围就是0~2.

input是一个张量,index是索引张量。input和index的size要么全部维度都相同,要么指定的dim那一维度值不同。输出为和index大小相同的张量。

import torch
a=torch.tensor([[.1,.2,.3],
        [1.1,1.2,1.3],
        [2.1,2.2,2.3],
        [3.1,3.2,3.3]])
b=torch.LongTensor([[1,2,1],
          [2,2,2],
          [2,2,2],
          [1,1,0]])
b=b.view(4,3) 
print(a.gather(1,b))
print(a.gather(0,b))
c=torch.LongTensor([1,2,0,1])
c=c.view(4,1)
print(a.gather(1,c))

输出:

tensor([[ 0.2000, 0.3000, 0.2000],
    [ 1.3000, 1.3000, 1.3000],
    [ 2.3000, 2.3000, 2.3000],
    [ 3.2000, 3.2000, 3.1000]])
tensor([[ 1.1000, 2.2000, 1.3000],
    [ 2.1000, 2.2000, 2.3000],
    [ 2.1000, 2.2000, 2.3000],
    [ 1.1000, 1.2000, 0.3000]])
tensor([[ 0.2000],
    [ 1.3000],
    [ 2.1000],
    [ 3.2000]])

squeeze

将维度为1的压缩掉。如size为(3,1,1,2),压缩之后为(3,2)

import torch
a=torch.randn(2,1,1,3)
print(a)
print(a.squeeze())

输出:

tensor([[[[-0.2320, 0.9513, 1.1613]]],
    [[[ 0.0901, 0.9613, -0.9344]]]])
tensor([[-0.2320, 0.9513, 1.1613],
    [ 0.0901, 0.9613, -0.9344]])

expand

扩展某个size为1的维度。如(2,2,1)扩展为(2,2,3)

import torch
x=torch.randn(2,2,1)
print(x)
y=x.expand(2,2,3)
print(y)

输出:

tensor([[[ 0.0608],
     [ 2.2106]],
 
    [[-1.9287],
     [ 0.8748]]])
tensor([[[ 0.0608, 0.0608, 0.0608],
     [ 2.2106, 2.2106, 2.2106]],
 
    [[-1.9287, -1.9287, -1.9287],
     [ 0.8748, 0.8748, 0.8748]]])

sum

size为(m,n,d)的张量,dim=1时,输出为size为(m,d)的张量

import torch
a=torch.tensor([[[1,2,3],[4,8,12]],[[1,2,3],[4,8,12]]])
print(a.sum())
print(a.sum(dim=1))

输出:

tensor(60)
tensor([[ 5, 10, 15],
    [ 5, 10, 15]])

contiguous

返回一个内存为连续的张量,如本身就是连续的,返回它自己。一般用在view()函数之前,因为view()要求调用张量是连续的。

可以通过is_contiguous查看张量内存是否连续。

import torch
a=torch.tensor([[[1,2,3],[4,8,12]],[[1,2,3],[4,8,12]]])
print(a.is_contiguous) 
print(a.contiguous().view(4,3))

输出:

<built-in method is_contiguous of Tensor object at 0x7f4b5e35afa0>
tensor([[ 1,  2,  3],
    [ 4,  8, 12],
    [ 1,  2,  3],
    [ 4,  8, 12]])

softmax

假设数组V有C个元素。对其进行softmax等价于将V的每个元素的指数除以所有元素的指数之和。这会使值落在区间(0,1)上,并且和为1。

对Pytorch 中的contiguous理解说明

import torch
import torch.nn.functional as F 
a=torch.tensor([[1.,1],[2,1],[3,1],[1,2],[1,3]])
b=F.softmax(a,dim=1)
print(b)

输出:

tensor([[ 0.5000, 0.5000],
    [ 0.7311, 0.2689],
    [ 0.8808, 0.1192],
    [ 0.2689, 0.7311],
    [ 0.1192, 0.8808]])

max

返回最大值,或指定维度的最大值以及index

import torch
a=torch.tensor([[.1,.2,.3],
        [1.1,1.2,1.3],
        [2.1,2.2,2.3],
        [3.1,3.2,3.3]])
print(a.max(dim=1))
print(a.max())

输出:

(tensor([ 0.3000, 1.3000, 2.3000, 3.3000]), tensor([ 2, 2, 2, 2]))
tensor(3.3000)

argmax

返回最大值的index

import torch
a=torch.tensor([[.1,.2,.3],
        [1.1,1.2,1.3],
        [2.1,2.2,2.3],
        [3.1,3.2,3.3]])
print(a.argmax(dim=1))
print(a.argmax())

输出:

tensor([ 2, 2, 2, 2])
tensor(11)

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

Python 相关文章推荐
Python模块搜索概念介绍及模块安装方法介绍
Jun 03 Python
Django框架中的对象列表视图使用示例
Jul 21 Python
Python 稀疏矩阵-sparse 存储和转换
May 27 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
基于python list对象中嵌套元组使用sort时的排序方法
Apr 18 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
May 05 Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 Python
解决tensorflow模型参数保存和加载的问题
Jul 26 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
Feb 26 Python
python字典改变value值方法总结
Jun 21 Python
分享unittest单元测试框架中几种常用的用例加载方法
Dec 02 Python
利用Python如何画一颗心、小人发射爱心
Feb 21 Python
Flask中jinja2的继承实现方法及实例
Mar 03 #Python
基于PyTorch中view的用法说明
Mar 03 #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
You might like
PHP通用检测函数集合
2011/02/08 PHP
修复ShopNC使用QQ 互联时提示100010 错误
2015/11/08 PHP
多个iframe自动调整大小的问题
2006/09/18 Javascript
用JavaScript编写COM组件的步骤
2009/03/17 Javascript
JavaScript 继承详解 第一篇
2009/08/30 Javascript
JQuery 拾色器插件发布-jquery.icolor.js
2010/10/20 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
IE的有条件注释判定IE版本详解(附实例代码)
2012/01/04 Javascript
NodeJS与Mysql的交互示例代码
2013/08/18 NodeJs
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
Vue.js每天必学之表单控件绑定
2016/09/05 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
Node.js包管理器Yarn的入门介绍与安装
2016/10/17 Javascript
JavaScript数据结构之二叉树的删除算法示例
2017/04/13 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
vue导出html、word和pdf的实现代码
2018/07/31 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
从理论角度讨论JavaScript闭包
2019/04/03 Javascript
原生小程序封装跑马灯效果
2020/10/21 Javascript
Ant Design Pro 之 ProTable使用操作
2020/10/31 Javascript
[16:14]教你分分钟做大人:米拉娜(HEROS)
2014/11/24 DOTA
Python 开发Activex组件方法
2009/11/08 Python
跟老齐学Python之再深点,更懂list
2014/09/20 Python
搞笑的程序猿:看看你是哪种Python程序员
2015/06/12 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
对django views中 request, response的常用操作详解
2019/07/17 Python
Django Serializer HiddenField隐藏字段实例
2020/03/31 Python
英国拖鞋购买网站:Bedroom Athletics
2020/02/28 全球购物
花卉与景观设计系大学生求职信
2013/10/01 职场文书
毕业生教师求职信
2013/10/20 职场文书
辅导员评语
2014/05/04 职场文书
售房协议书范本2014
2014/10/23 职场文书
四风问题原因分析及整改措施
2014/10/24 职场文书
手把手教你用SpringBoot将文件打包成zip存放或导出
2021/06/11 Java/Android