pytorch中的.detach()

我认为所谓的.detcah()就是两步操作:

  1. copy() 将原来的变量复制一份
  2. variable---->tensor 将复制品变为Tensor
x = Variable(t.rand(1,2,3), requires_grad=True)
y = Variable(t.rand(1,2,3), requires_grad=True)
z = (x.detach()*y)
print('1', x)
print('2', y)
z = y**2
t.sum(z).backward()
print('3', y.grad.data)
print('4', x.grad)

z1 = (x*y)
t.sum(z1).backward()
print('5', x)
print('6', x.grad.data)

输出如下:

1 tensor([[[0.1315, 0.0035, 0.1518],
         [0.3182, 0.0520, 0.9082]]], requires_grad=True)
2 tensor([[[0.3761, 0.5830, 0.3036],
         [0.3458, 0.4926, 0.3941]]], requires_grad=True)
3 tensor([[[0.7522, 1.1660, 0.6071],
         [0.6916, 0.9852, 0.7882]]])
4 None
5 tensor([[[0.1315, 0.0035, 0.1518],
         [0.3182, 0.0520, 0.9082]]], requires_grad=True)
6 tensor([[[0.3761, 0.5830, 0.3036],
         [0.3458, 0.4926, 0.3941]]])
  1. 可以看到detach()复制品之后的梯度还是正常的反向传播,但是之前的梯度因为detach()复制品本身是Tensor,自然就不可能传回去了,而且x.detach()和x都不是一个东西了,x.detcah()相当于新的叶节点。
  2. 既然是copy(), x.detcah()的操作对于x没有一点影响,x想怎么浪还是怎么浪,x.detcah()虽然是x的阉割版,x本身依旧坚挺,反向传播还是可以通过x的。
  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值