Pytorch中获取输入数据的梯度

Pytorch中获取输入数据的梯度

在设计算法的时候需要使用输入数据的梯度,但是始终没有提取出来,这里记录一下我解决问题的方法。

原理

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 的设置

你可能感兴趣的:(pytorch,深度学习,神经网络)