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

相关推荐
来让爷抱一个7 小时前
2026 纹理一致性实战:贴图不许花脸,百智云精灵图把材质契约写进素材包
人工智能·机器学习·材质·贴图
零依赖极客7 小时前
Day 8·1 自注意力机制:Q·K^T/softmax/V的在线计算
c语言·arm开发·人工智能·llama
我命由我123457 小时前
人脸识别 - 去重时间窗口
java·开发语言·python·学习·java-ee·学习方法·python3.11
幻影123!8 小时前
AlphaZero 五子棋实战(五):评估工具 —— 学会在错误的地方掉头
人工智能·机器学习·强化学习·alpha zero
jbk33118 小时前
PixiuCut「视频批量分割」支持智能镜头分割、按时长、按数量分割,可定义最小时长避免无效片段等多可选参数可设置
人工智能·音视频·剪辑软件·剪映自动化软件
诺伦8 小时前
RiseClaw玄策:GEO优化工程实战,从零搭建生成式引擎优化体系
人工智能·chatgpt
王志来137944730088 小时前
安防监控工控工业服务器配套
运维·服务器·python
星禾元亨8 小时前
企业 AI 落地 5 步路线图:诊断、企业知识库与 GEO 获客的工程化实施步骤
大数据·人工智能·自动化·创业创新
苏打水com8 小时前
内容合规红线:大模型生成内容,哪些能做哪些会犯法?
人工智能·安全·大模型