有关pytorch 的梯度的相关问题

1、关于backward的叠加问题

import torch
x = torch.FloatTensor([[1, 2], [4, 5]])
b = torch.FloatTensor([[2, 4], [5, 3]])
x.requires_grad = True
y=torch.mm(b,x)
print(y)
loss=y[0][0]+y[0][1]+y[1][0]+y[1][1]
print(loss)
loss.backward(retain_graph=True)
g=x.grad
print(g)
loss.backward(retain_graph=True)
print(x.grad)
"""
output
tensor([[18., 24.],
        [17., 25.]], grad_fn=<MmBackward>)
tensor(84., grad_fn=<AddBackward0>)
tensor([[7., 7.],
        [7., 7.]])
tensor([[14., 14.],
        [14., 14.]])<----------------------------
   
"""
import torch
x = torch.FloatTensor([[1, 2], [4, 5]])
b = torch.FloatTensor([[2,4],[5,3]])
x.requires_grad = True
y=torch.mm(b,x)
print(y)
loss=y[0][0]+y[0][1]+y[1][0]+y[1][1]
print(loss)
loss.backward(retain_graph=True)
g=x.grad
print(g)
x.grad.data.zero_()
y2 =loss
print(y2)
y2.backward()
print(x.grad)
"""
output
tensor([[18., 24.],
        [17., 25.]], grad_fn=<MmBackward>)
tensor(84., grad_fn=<AddBackward0>)
tensor([[7., 7.],
        [7., 7.]])
tensor(84., grad_fn=<AddBackward0>)
tensor([[7., 7.],
        [7., 7.]])<-------------------------
"""

当我们进行两次backward的时候梯度是不断叠加的(或者说只有进行backward后梯度再回真正的纳入计算,并且不释放的情况下会一直叠加),这也就是我们为什么要每次进行优化的时候都要进行optimizer.zero_grad()或者针对于某个参数进行梯度归零

import torch
x = torch.FloatTensor([[1, 2], [4, 5]])
x.requires_grad = True
y=2*x.mean()
print(x.grad)
z=4*x.mean()
y.backward()
print(x.grad)

"""
None
tensor([[0.5000, 0.5000],
        [0.5000, 0.5000]])
可以观察到,不论在什么位置,x后续又做了什么计算,backward值计算从y开始的那一部分
"""
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值