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 完全没有联系,类似于深拷贝

相关推荐
沫儿笙1 分钟前
安川弧焊机器人二保焊节气装置
人工智能·机器人
川西胖墩墩2 分钟前
教育智能化:自适应学习与知识图谱构建
人工智能·学习·知识图谱
嫂子开门我是_我哥2 分钟前
第十七节:项目实战1:猜数字游戏(模块化开发实现)
开发语言·python·算法·游戏
神一样的老师3 分钟前
【RT-Thread Titan Board 开发板】显示SD卡上JPEG图片的EXIF信息
人工智能·单片机·嵌入式硬件
茶栀(*´I`*)4 分钟前
【OpenCV 实战】图像基础操作与算术运算:从像素访问到图像混合
人工智能·opencv·计算机视觉
橙露8 分钟前
CGO调用OpenCV实现多角度模板匹配性能分析
人工智能·opencv·计算机视觉
STLearner10 分钟前
MM 2025 | 时间序列(Time Series)论文总结【预测,分类,异常检测,医疗时序】
论文阅读·人工智能·深度学习·神经网络·算法·机器学习·数据挖掘
光羽隹衡10 分钟前
计算机视觉--Opencv(边缘检测)
人工智能·opencv·计算机视觉
春日见12 分钟前
Git 相关操作大全
linux·人工智能·驱动开发·git·算法·机器学习
Kingfar_115 分钟前
高速列车驾驶员情境意识动态建模及生理反应机制研究
人工智能·机器学习