在设计算法的时候需要使用输入数据的梯度,但是始终没有提取出来,这里记录一下我解决问题的方法。
Pytorch中获取数据的梯度是通过autograd.backward()方法来进行自动梯度计算的,在Pytorch官网上有相关的完整教程,我也同时参考了几篇网上的博客,针对其应用方法建立了一个相对完整的认识。
官网教程:Pytorch > Docs > Automatic differentiation package - torch.autograd > torch.autograd.backward
博客教程:CSDN > pytorch计算模型关于输入数据的梯度
print("input1 grad : {} size : {} type : {}".format(input1.grad, input1.size(), type(input1)))
# 反向传输前
feat.backward(torch.ones(feat.size()).double().to(device))
# 反向传输后
print("input1 grad : {} size : {} type : {}".format(input1.grad, input1.size(), type(input1)))
结果
input1 grad : None size : torch.Size([32, 3, 288, 144]) type : <class 'torch.Tensor'>
input1 grad : tensor([[[[ 3.0273e-01, -1.3339e-01, -2.0777e-01, ..., -8.5362e-01,
1.5077e-01, -9.9600e-01],
[-1.4387e-02, 7.3319e-01, 6.4626e-01, ..., -7.5889e-01,
-3.6603e-01, 2.6395e-01],
...,
[-4.8938e-02, 3.6466e-02, 5.0337e-02, ..., -1.4971e-02,
5.6196e-02, -2.6905e-02]]]], device='cuda:0') size : torch.Size([32, 3, 288, 144]) type : <class 'torch.Tensor'>
在一开始进行实验的时候,我发现即使经过反向传播,输入数据input1的梯度同样为None,其原因就在于没有正确地对于输入数据input1是否需要梯度进行设置,在重新设置后,得到了理想的输出结果。
错误
input1 = Variable(input1.cuda())
正确
input1 = Variable(input1.cuda(), requires_grad=True)
关键在于 requires_grad=True 的设置