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

相关推荐
Pocker_Spades_A2 分钟前
论文精读(十四):基于先验地图的视觉重定位方法综述:启元机器人“知道自己在哪“的底层能力
大数据·人工智能·机器人
昨日之日20065 分钟前
FLUX 3 Image Klein:一键搞定文生图和智能编辑,支持精准布局,黑森林新开源
人工智能·计算机视觉·ai作画
Chengbei119 分钟前
JsOwl|AI 赋能 JS 敏感信息扫描器,AST + 正则、source‑map 源码还原、登录态爬虫输出交互式 HTML 报告
开发语言·javascript·网络·人工智能·爬虫·网络安全·自动化
leoZ23113 分钟前
第 31 篇 金融与医疗:高合规行业的 AI 产品方法论
大数据·人工智能·金融·大模型·agent
细节处有神明16 分钟前
零样本时序预测:Mistral Timestral 本地实测
人工智能·机器学习·时间序列
阿明副业观察20 分钟前
AI短剧分镜秘籍:从零到电影级视觉冲击
大数据·人工智能·aigc·音视频·ai写作
pride.li21 分钟前
第12章 Python 教程-流程控制:循环结构
linux·服务器·python·算法
艾克斯观察22 分钟前
做产品正在失去稀缺性,功能即护城河的时代结束了?
人工智能·产品运营·逆向工程·rea·渠道分发
邓工说电24 分钟前
智慧用电常见问题全解答:概念辨析、技术构成、落地路径与选型判断
人工智能
迪飞特科技24 分钟前
业务是否适合 AI 改造,3 个可落地的判断评估标准
人工智能