pytorch小记(六):pytorch中的clone和detach操作:克隆/复制数据 vs 共享相同数据但 与计算图断开联系

pytorch小记(六):pytorch中的clone和detach操作:克隆/复制数据 vs 共享相同数据但 与计算图断开联系


以下代码片段:

python 复制代码
self.x = x.clone().detach()  # 或 torch.tensor(x).float()

用于处理和复制张量 x,并根据需要使其与原始计算图断开联系或改变其数据类型。下面是逐部分详细解释。


1. x.clone()

  • 作用 :对张量 x 进行深拷贝,生成一个新的张量。
    • 新的张量和原始张量具有相同的数据,但存储在不同的内存空间。
    • 修改 clone() 的返回值不会影响原始张量。

示例:

python 复制代码
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = x.clone()

y[0] = 99.0
print(x)  # tensor([1., 2., 3.], grad_fn=<CloneBackward>)
print(y)  # tensor([99.,  2.,  3.])

2. x.detach()

  • 作用 :返回一个与 x 共享相同数据但 与计算图断开联系 的张量。
    • 通常用于阻止梯度计算。
    • 在神经网络中,如果你不希望某些操作影响反向传播时,会用到 detach()

示例:

python 复制代码
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = x.detach()

y[0] = 99.0  # y 的数据更改不会影响 x
print(x)  # tensor([1., 2., 3.], requires_grad=True)
print(y)  # tensor([99.,  2.,  3.])

使用场景:

detach() 在以下场景中非常有用:

  1. 阻止梯度传播:

    python 复制代码
    z = x.clone().detach()
    # z 不会参与反向传播,x 的梯度也不会受 z 的影响
  2. 保存模型状态或生成推断结果:

    python 复制代码
    with torch.no_grad():
        output = model(x)  # 临时禁用梯度计算

3. torch.tensor(x).float()

  • 作用 :将输入 x 转换为 PyTorch 张量,并将其数据类型强制为 torch.float32(默认浮点类型)。
  • 适用场景:
    • 输入可能是一个 Python 列表或 NumPy 数组时,用于将其转换为 PyTorch 张量。
    • 确保张量数据类型一致(某些模型或操作对数据类型有严格要求)。

示例:

python 复制代码
x = [[1, 2, 3], [4, 5, 6]]  # Python 列表
y = torch.tensor(x).float()  # 转为 torch.float32 类型的张量
print(y)
# tensor([[1., 2., 3.],
#         [4., 5., 6.]])

4. 两者的对比与结合

  • x.clone().detach()torch.tensor(x).float() 是不同的操作:

    1. x.clone().detach()
      • 复制一个现有张量,且与原始计算图断开。
      • 适用于 PyTorch 张量 x,不适用于列表或其他数据类型。
    2. torch.tensor(x).float()
      • 将输入转换为新的 PyTorch 张量,适用于从非张量对象(如列表、NumPy 数组)构造张量。
      • 转换过程中可以指定数据类型(如 .float())。
  • 结合使用

    如果需要复制一个张量、改变数据类型,并断开计算图,可以将两者结合:

    python 复制代码
    self.x = torch.tensor(x.clone().detach()).float()

使用场景

x.clone().detach()

  • x 是一个 PyTorch 张量,且需要:
    • 复制数据。
    • 与原始计算图断开。

torch.tensor(x).float()

  • x 是一个非 PyTorch 张量对象(如列表或 NumPy 数组),且需要:
    • 转换为 PyTorch 张量。
    • 确保数据类型为浮点型。

完整示例:

python 复制代码
import torch

# 输入张量
x = torch.tensor([[2.0, -1.0], [1.0, 1.0]], requires_grad=True)

# 使用 clone().detach()
y = x.clone().detach()
y[0, 0] = 99.0
print("x:", x)  # 原始张量不会改变
print("y:", y)  # 新张量修改了

# 使用 torch.tensor()
z = torch.tensor([[1, 2], [3, 4]]).float()
print("z:", z)  # 转换为浮点张量

总结

  • clone():深拷贝一个张量。
  • detach():断开张量与计算图的连接。
  • torch.tensor(x).float():将非张量数据转换为浮点型 PyTorch 张量。
  • 它们在不同场景下各有用途,可以单独使用或结合使用。
相关推荐
未若君雅裁8 小时前
让模型按契约返回数据,LangChain 结构化输出实战
python·langchain
九硕智慧建筑一体化厂家8 小时前
智慧建筑高效管控!楼宇自控系统赋能新能源园区智能运维
运维·人工智能·笔记·智慧城市
2601_954526759 小时前
2026 生成式搜索引擎底层技术演进与 GEO优化服务商推荐:大模型检索增强(RAG)管道与语义对齐工程实战
大数据·人工智能·搜索引擎
我有满天星辰9 小时前
Spring AI Prompt 实战:System Prompt、User Prompt 与 PromptTemplate
人工智能·spring·prompt
A15362559 小时前
WMS 仓储管理系统推荐:企业如何选适配的仓储管理系统
大数据·人工智能
学习中.........9 小时前
Transformer 训练资源估算:以 CS336 GPT-2 XL 配置为例
人工智能·python·算法·机器学习·自然语言处理
Setsuna_F_Seiei13 小时前
前端的 AI 学习之路 02 之 Provider 与 Structured Output - 规范化模型输入输出
人工智能·agent·ai编程
JavaPub-rodert14 小时前
王仕宇RAG 实战教程(二):从 0 搭建一个可运行的 RAG 知识库——Embedding、Qdrant 与问答实战
人工智能·embedding
Setsuna_F_Seiei14 小时前
前端的 AI 学习之路 01 之 Agent API 调用 - 和 Agent 的基础对话
前端·人工智能·ai编程
咔咔学姐kk15 小时前
小白程序员必收藏:轻松入门AI Agent开发,大厂校招新风口!
人工智能·深度学习·ai·程序员·大模型·就业·大模型学习