跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

PyTorch里clone()和detach()怎么用?区别在哪?

文章导读

在PyTorch中,clone()和detach()是两个常用的操作,用于处理tensor的复制和梯度。但它们有什么区别呢?本文将详细讲解这两个操作的使用方法和区别,帮助你更好地理解PyTorch中的tensor操作。

clone() 和 detach() 的对比

PyTorch中,向量或矩阵的赋值是指向同一内存的,这与Matlab不同。如果需要保存旧的tensor,就需要使用clone()进行深拷贝。

import torch

a = torch.tensor(1.0, requires_grad=True)
b = a.clone()
c = a.detach()
a.data *= 3
b += 1

print(a) # tensor(3., requires_grad=True)
print(b)
print(c)

输出结果:

tensor(3., requires_grad=True)
tensor(2., grad_fn=)
tensor(3.) # detach()后的值随着a的变化出现变化

分析输出数据类型的区别

原始a:tensor(3., requires_grad=True)

a.clone():grad_fn=,表示clone后的返回值是个中间变量,因此支持梯度的回溯。clone操作在一定程度上可以视为是一个identity-mapping函数。

detach()操作后的tensor与原始tensor共享数据内存,当原始tensor在计算图中数值发生反向传播等更新之后,detach()的tensor值也发生了改变。

注意:在PyTorch中我们不要直接使用id是否相等来判断tensor是否共享内存,这只是充分条件,因为也许底层共享数据内存,但是仍然是新的tensor,比如detach(),如果我们直接打印id会出现以下情况。

clone操作详解

clone操作返回一个和源张量同shape、dtype和device的张量,与源张量不共享数据内存,但提供梯度的回溯。

import torch

a = torch.tensor(1.0, requires_grad=True, device=
                            

相关文章