pytorch | contiguous() 函数

1. 背景

torch中一些操作会改变原数据,比如:narrow() view() expand() transpose()等操作,在使用transpose()进行转置操作时,pytorch并不会创建新的、转置后的tensor,而是修改了tensor中的一些属性(也就是元数据),使得此时的offset和stride是与转置tensor相对应的。转置的tensor和原tensor的内存是共享的,即改变转置后的tensor, 原先tensor中内容也会改变,而contiguous方法就类似深拷贝,使得上面这些操作不会改变元数据

2. 示例

python 复制代码
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 会随 y 的改变而改变

修改前:

x- tensor([[-1.2076, -0.5300],

[-0.0826, -1.0144],

[ 1.2097, -1.2360]])

y- tensor([[-1.2076, -0.0826, 1.2097],

[-0.5300, -1.0144, -1.2360]])

修改后:

x- tensor([[11.0000, -0.5300],

[-0.0826, -1.0144],

[ 1.2097, -1.2360]])

y- tensor([[11.0000, -0.0826, 1.2097],

[-0.5300, -1.0144, -1.2360]])

使用 conguous方法

python 复制代码
import torch
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并没有随y的改变而改变

x- tensor([[ 1.3756, -0.1766],

[ 0.9518, -1.7000],

[-1.0423, -0.6077]])

y- tensor([[ 1.3756, 0.9518, -1.0423],

[-0.1766, -1.7000, -0.6077]])

修改后:

x- tensor([[ 1.3756, -0.1766],

[ 0.9518, -1.7000],

[-1.0423, -0.6077]])

y- tensor([[11.0000, 0.9518, -1.0423],

[-0.1766, -1.7000, -0.6077]])

3. 总结

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

相关推荐
Null箘5 分钟前
从零创建一个 Django 项目
后端·python·django
云空9 分钟前
《解锁 Python 数据挖掘的奥秘》
开发语言·python·数据挖掘
玖年41 分钟前
Python re模块 用法详解 学习py正则表达式看这一篇就够了 超详细
python
岑梓铭1 小时前
(CentOs系统虚拟机)Standalone模式下安装部署“基于Python编写”的Spark框架
linux·python·spark·centos
边缘计算社区1 小时前
首个!艾灵参编的工业边缘计算国家标准正式发布
大数据·人工智能·边缘计算
游客5201 小时前
opencv中的各种滤波器简介
图像处理·人工智能·python·opencv·计算机视觉
一位小说男主1 小时前
编码器与解码器:从‘乱码’到‘通话’
人工智能·深度学习
Eric.Lee20211 小时前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
Dontla1 小时前
vscode怎么设置anaconda python解释器(anaconda解释器、vscode解释器)
ide·vscode·python
深圳南柯电子1 小时前
深圳南柯电子|电子设备EMC测试整改:常见问题与解决方案
人工智能