pytorch 中 contiguous() 函数理解



文章目录

  • pytorch 中 contiguous() 函数理解
    • 引言
    • 使用 contiguous()
    • 后记

文章抄自 Pytorch中contiguous()函数理解-清晨的光明-CSDN ,仅用作个人学习和记录。如有帮助,请关注原作者,给原作者点赞。


引言

在 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() 就可以了!

pytorch 中 contiguous() 函数理解相关推荐

  1. Pytorch中contiguous()函数理解

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

  2. pytorch中repeat()函数理解

    pytorch中repeat()函数理解 最近在学习过程中遇到了repeat()函数的使用,这里记录一下自己对这个函数的理解. 情况1:repeat参数个数与tensor维数一致时 a = torch ...

  3. pytorch中unsqueeze()函数理解

    unsqueeze()函数起升维的作用,参数表示在哪个地方加一个维度. 在第一个维度(中括号)的每个元素加中括号 0表示在张量最外层加一个中括号变成第一维. 直接看例子: import torch i ...

  4. torch中contiguous()函数

    1. 背景 torch中一些操作会改变原数据,比如:narrow() view() expand() transpose()等操作,在使用transpose()进行转置操作时,pytorch并不会创建 ...

  5. Pytorch中tensor.view().permute().contiguous()函数理解

    Pytorch中tensor.view().permute().contiguous()函数理解 yolov3中有一行这样的代码,在此记录一下三个函数的含义 # 例子中batch_size为整型,le ...

  6. **Pytorch 中view函数和reshape函数的区别*

    Pytorch 中view函数和reshape函数的区别(我是一名大一刚学计算机的学生 希望我的说法对你有帮助) 首先:要了解这个问题我们要先了解一个基本知识 张量的储存方式 跟据图片我们可以清楚的看 ...

  7. PyTorch中contiguous、view、Sequential、permute函数的用法

    在pytorch中,tensor的实际数据以一维数组(storage)的形式存储于某个连续的内存中,以"行优先"进行存储. 1. tensor的连续性 tensor连续(conti ...

  8. Pytorch中gather函数的个人理解方法

    之前一直理解不了Pytorch中gather的用法,看了官方的文档也是一头雾水.然后自己琢磨,找规律,用以下方法进行理解. 一.官方文档 torch.gather(input, dim, index, ...

  9. python batchnorm2d_BatchNorm2d原理、作用及其pytorch中BatchNorm2d函数的参数讲解

    BN原理.作用: 函数参数讲解: BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) 1. ...

最新文章

  1. mysql之DML(SELECT DELETE INSERT UPDATE)
  2. This 在 C# 中的含义
  3. mysql 导入mongodb_mysql数据库迁移导入到mongodb详细教程
  4. lesson2-python3数据类型
  5. java oracle 字符_Oracle转义字符
  6. github—本地域名配置方式
  7. 写个买卖小游戏,第1天(昨天)
  8. 机器学习--------SVM
  9. 实数系的基本定理_初中数学:重点公式定理集合,中学生应该看一看
  10. ubuntu18.04清理磁盘空间
  11. 手游LTV(生命周期价值)计算公式
  12. 人物志 | 美团无人机毛一年:建成空中机器人物流网络是技术人一生的梦想
  13. 详解DNS服务、DNS解析、DNS劫持和污染
  14. dell服务器卡在启动界面_戴尔最新bios设置图解 当电脑出现开机画面按F2进入
  15. 当双绞线遇上光纤布线-NETLINK多模光纤收发器HTB-1100
  16. 我的架构梦:(九十九)消息中间件之RocketMQ的高可用机制——消息消费高可用
  17. redisHyperLogLog原理解析
  18. 基于java的客户订单管理系统
  19. 覆盖率COV的命令设置及收集
  20. RK3288核心板金手指接插方式支持 Android5.1 Android7.1、Linux 操作系统

热门文章

  1. 第五章课后题答案 软件需求基础
  2. 百万年薪的PMO项目经理是如何做好沟通管理和情绪管理的?
  3. ajax封装----原生
  4. python处理excel系列一之根据文件名从一文件夹批量复制文件到新文件夹并进行处理
  5. Beginning PostgreSQL on the Cloud 电子书分享
  6. 怎样在linux上打开项目,如何在Linux平台运行HelloWorld及测试项目
  7. 计算机软考2008上半年,北京2008下半年计算机软考各科目考试安排
  8. 【TensorFlow】TF不支持GPU,The minimum required Cuda capability is 3.5.
  9. 调通sina33m下的GC0308(分色排版)V1.0
  10. HTML_03 快速入门 表格框架