Pytorch中contiguous()函数理解

2023-10-27

引言

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

会改变元数据的操作是:

  • narrow()
  • view()
  • expand()
  • transpose() 

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

transpose()后改变元数据,代码示例: 

x = torch.randn(3, 2)
y = torch.transpose(x, 0, 1)
print("修改前:")
print("x-", x)
print("y-", y)

print("\n修改后:")
y[0, 0] = 11
print("x-", x)
print("y-", y)

 运行结果:

修改前:
x- tensor([[-0.5670, -1.0277],
           [ 0.1981, -1.2250],
           [ 0.8494, -1.4234]])
y- tensor([[-0.5670,  0.1981,  0.8494],
           [-1.0277, -1.2250, -1.4234]])

修改后:
x- tensor([[11.0000, -1.0277],
           [ 0.1981, -1.2250],
           [ 0.8494, -1.4234]])
y- tensor([[11.0000,  0.1981,  0.8494],
           [-1.0277, -1.2250, -1.4234]])

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

因此可以说,x是contiguous的,但y不是(因为内部数据不是通常的布局方式)。注意不要被contiguous的字面意思“连续的”误解,tensor中数据还是在内存中一块区域里,只是布局的问题!

为什么这么说:因为,y里面数据布局的方式和从头开始创建一个常规的tensor布局的方式是不一样的。这个可能只是python中之前常用的浅拷贝y还是指向x变量所处的位置,只是说记录了transpose这个变化的布局。


使用contiguous() 

如果想要断开这两个变量之间的依赖(x本身是contiguous的),就要使用contiguous()针对x进行变化感觉上就是我们认为的深拷贝

 当调用contiguous()时会强制拷贝一份tensor,让它的布局和从头创建的一模一样,但是两个tensor完全没有联系

 代码示例:

x = torch.randn(3, 2)
y = torch.transpose(x, 0, 1).contiguous()
print("修改前:")
print("x-", x)
print("y-", y)

print("\n修改后:")
y[0, 0] = 11
print("x-", x)
print("y-", y)

运行结果: 

修改前:
x- tensor([[ 0.9730,  0.8559],
           [ 1.6064,  1.4375],
           [-1.0905,  1.0690]])
y- tensor([[ 0.9730,  1.6064, -1.0905],
           [ 0.8559,  1.4375,  1.0690]])

修改后:
x- tensor([[ 0.9730,  0.8559],
           [ 1.6064,  1.4375],
           [-1.0905,  1.0690]])
y- tensor([[11.0000,  1.6064, -1.0905],
           [ 0.8559,  1.4375,  1.0690]])

 可以看到,当对y使用了.contiguous()后,改变y的值时,x没有任何影响


后记 

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

RuntimeError: input is not contiguous

 这时候只需要在该变量后面加上.contiguous()就可以了!


参考资料:

https://blog.csdn.net/gdymind/article/details/82662502

https://www.jianshu.com/p/7e72cc1ab7a0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pytorch中contiguous()函数理解 的相关文章

随机推荐

  • Python2 ValueError: chr() arg not in range(256)?

    代码 for i in range 0x4E00 0x4E10 print chr i 错误提示 ValueError chr arg not in range 256 原因 因为Python2问题编码问题导致 解决办法 使用unichr代
  • #Flutter 裁剪布局之 ClipRect、ClipRRect、ClipOval、ClipPath、CustomClipper

    Flutter 裁剪布局之 ClipRect ClipRRect ClipOval ClipPath CustomClipper 文章目录 裁剪布局 ClipRect ClipRRect ClipOval ClipPath 及 Custom
  • 特征工程(四)HashingVectorizer

    将原始数据的word特征数字化为hash特征 并将结果保存到本地 article特征可做类似处理 import pandas as pd from sklearn feature extraction text import Hashing
  • SDNE(Structural Deep Network Embedding )的原理,实现与应用

    文章目录 SDNE基本思想 二阶相似度 无监督 一阶相似度 有监督 核心代码 库实现 应用 阿里凑单算法 SDNE基本思想 SDNE Structural Deep Network Embedding 主要目标是保持网络的一阶相似性和二阶相
  • Unity小地图的放大缩小

    继续承接上篇内容 本篇讲述小地图的放大和缩小功能 如下图 点击 按钮可以放大地图 点击 按钮可以缩小地图 更多内容关注 unity风雨路 上一篇中我们已经讲过小地图的UI结构图 此处不再赘述 如图 我们只需在此基础上给 符号等image图全
  • Linux下C++定时器的使用

    LInux下C 定时器的使用 include
  • 图像分类之花卉图像分类(一)数据增强

    网上有很多图像分类的代码 有很多是必须要在GPU上面才能跑的 因为我想在自己的电脑跑 所以很多都是不能用的 而且说实话很多对我这个小白来说 都很难看懂 所以我找了一个就是之间用CNN写的神经卷积模型用来进行花卉识别 其中主要参考了以下的博主
  • Stable Diffusion 安装

    一 安装 GPU 驱动 CPU 环境跳过这一步 手动安装GPU驱动参考 https docs nvidia com datacenter tesla tesla installation notes index html spm a2c4g
  • 单元测试中测试用例的设计示例

    对于多个输入的被测试模块 可以通过正交排列和正交表选取具有代表性的测试用例 模块代码如下 int mySum int a int b int c int aa bb cc if a lt 0 aa 0 else aa 1 if b lt 1
  • id 怎么获取jira 评论_如何获取抖音、快手、微视等短视频快速吸粉

    很多朋友不知道如何获取短视频平台ID 下行我来详细为大家讲解一下 如果看了还不懂的朋友 或者需要在以下快速出效果的朋友可以 喂aabb ccnn 就好了 S粉 你懂的 1 抖音 点赞时如何正确获取抖音ID 虽然说抖音刷粉丝可以使用用户ID来
  • Spark Core笔记

    Spark Core笔记 Spark 一 What is Spark Apache Spark is a fast and general engine for large scale data processing 二 Spark框架优势
  • 一道华为的笔试题

    刚做了一道华为的笔试题 不是很理想 因为审题审了将近半小时 题目写的有点弯弯绕绕的 读了半天才读懂 现把题目附上 希望能给大家一点帮助 博主很不服气 感觉是败在了语文的阅读理解上 1 题目 对一个数据a进行分类 分类方法为 此数据a 四个字
  • 用Openswan组建Linux IPSec ---第一部分

    用Openswan组建Linux IPSec Linux下建立IPSEC的vpn第一部分 1 概述 2 安装Openswan 3 认证和配置 3 1 RSAsig认证方式的配置 3 2 x 509证书认证的配置 3 3 RoadWarrio
  • 设计模式--单例模式

    单例模式是最容易的设计模式了 但是用得非常多 我在项目中接触的一个就是单例模式 单例模式的适用范围 单例模式适合于一个类只有一个实例的情况 比如窗口管理器 打印缓冲池和文件系统 它们都是原型的例子 典型的情况是 那些对象的类型被遍及一个软件
  • OkHttp的用法和高效配置

    转载请声明来自http blog csdn net super kingking article details 70992012 现在OkHttp越来越火 并伴随着RxJava Retrofit的组合 功能非常的强大 使其越受开发者的关注
  • 浅谈学习C语言第一天的感受及对编程未来目标规划

    我是一个大学计算机专业的学生 在之前学过一些Python 由于升学原因 需要学习C语言 所以在暑假期间开始自学一些关于C语言的知识和内容对于C语言 个人认为动手实践是非常重要的 毕竟编程是一个需要多动手练习 对于代码我从先学习模仿 等后面在
  • vue事件

    event click testEvent event testEvent e console log e e srcElement style background red e srcElement表示当前元素 事件冒泡 原生js中的组织
  • anaconda3 安装mysql的包

    python3 安装步骤 step 1 下载python3版本的包 mysqlclient cp37 cp37m win amd64 whl 下载cp3开头的文件 step 2 使用cmd切入anaconda的安装目录 如 D Anacon
  • Xcode - 使用 chisel 提高 LLDB 调试效率

    源链接 https viktyz gitbooks io iosnotebook gitbook Notes Note 00129 20160108 html 方案名称 Xcode 使用 chisel 提高 LLDB 调试效率 关键字 Xc
  • Pytorch中contiguous()函数理解

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