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

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值