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

相关推荐
思陌Ai算法定制几秒前
【心血管影像AI预测预后】心肌梗死后心脏MRI如何更早识别高风险患者?
人工智能·影像组学·心血管影像·心脏mri·心肌梗死·stemi·微循环阻塞
大蚂蚁2号1 分钟前
本地批量音视频转文本免费工具
python·音视频·开源软件
云烟成雨TD2 分钟前
Agent Scope Java 2.x 系列【6】消息层
java·人工智能·agent
云烟成雨TD3 分钟前
Spring AI Alibaba 1.x 系列【74】Agentic RAG 与混合 RAG
java·人工智能·spring
Tiansan66663 分钟前
郑州AI问答推广:2家优质服务商剖析
人工智能·郑州ai问答推广2家
“码”力全开6 分钟前
解耦异构算力:基于 Docker 与边缘计算的 GB28181/RTSP 企业级 AI 视频管理平台架构设计(含源码交付)
人工智能·docker·边缘计算
云烟成雨TD6 分钟前
Spring AI Alibaba 1.x 系列【79】图执行生命周期的可观测性基础设施
java·人工智能·spring
kishu_iOS&AI6 分钟前
LLM —— Milvmus向量数据库
数据库·人工智能·milvus
celiahul6 分钟前
结构化内容:让网站同时适配搜索引擎与 AI 工具
人工智能·搜索引擎
qq_8573058196 分钟前
OpenCV入门
人工智能·opencv·计算机视觉