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

相关推荐
FPGA信号处理29 分钟前
【模式识别】第三节课:分类误差的来源与线性分类器
人工智能·分类·数据挖掘
hrrrrxeeeee30 分钟前
电商从业者AI技能提升:证书选择与商品、客服、运营场景落地
人工智能
东莞市云毅网络有限公司5 小时前
AI 引用句逐条回指原文:让回答可回溯的校验实现
python·数据清洗·rag·企业知识库·文档解析
小和尚同志5 小时前
1.8k star 的开源 token 使用量监控神器— TokenTracker
人工智能·ai编程
极客 - L U6 小时前
神经网络 - 激活函数、损失函数、优化器
人工智能·深度学习·神经网络
数字融合7 小时前
透明化视频三维矿山井下照明重建技术
人工智能·python·数码相机
yi0117 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
xiangzhihong87 小时前
创之星花店多端业务闭环拆解
人工智能
奈落247 小时前
AI 编程从助手到 Agent:基于两份资料看哪些环节可以交出去,哪些必须自己攥住
大数据·人工智能
Joker可视化开发平台7 小时前
AI短剧接棒真人剧:开机量跌七成,普通人进场窗口在收窄
大数据·人工智能