Pytorch中detach()的作用、与grad.zero_()的区别

detach()的作用

detach()函数返回一个和源张量同shape、dtype和device的张tensor,是从当前计算图中分离下来的,与源张量共享数据内存,仍指向原变量的存放位置,不同之处只是requires_grad为false,得到的这个tensor永远不需要计算其梯度,不具有grad。即使之后重新将它的requires_grad置为true,它也不会具有梯度grad

注意:使用detach返回的tensor和原始的tensor共同一个内存,即一个修改另一个也会跟着改变

Tensor.detach() 的作用是阻断反向梯度传播,当我们在训练网络的时候可能希望保持一部分的网络参数不变,只对其中一部分的参数进行调整;或者只训练部分分支网络,并不让其梯度对主网络的梯度造成影响,这时候我们就需要使用detach()函数来切断一些分支的反向传播,例如在生成对抗网络的训练当中,在训练判别器的时候不需要生成器进行反向梯度传播,这时候就会使用到 detach()。

import torch

a = torch.tensor(2.0, requires_grad=True)
y = a ** 2
a_ = a.detach()
print(a_.grad)  # None,requires_grad=False
a_.requires_grad_()  # set a_.requires_grad = True
z = a_ * 3
y.backward()
z.backward()
print(a_.grad)  # tensor(3.)
print(a.grad)  # tensor(4.)

与grad.zero_()比较

grad.zero_() 和 detach() 都是在PyTorch中用于梯度计算和反向传播的函数,但它们的作用有所不同。

grad.zero_()用于将张量的梯度设置为零。这个操作通常在每个 batch 的训练之前执行,以避免累积梯度对训练产生影响。

detach()用于将张量从计算图中分离出来。这个操作通常在需要保留一些值的情况下使用,例如需要将一个模型的输出用作输入传递给另一个模型,但是不需要对第一个模型的梯度进行计算。

你可能感兴趣的:(pytorch,深度学习,机器学习)