PyTorch 如何检查模型梯度是否可导

时间:2022-03-07 02:52:41

一、PyTorch 检查模型梯度是否可导

当我们构建复杂网络模型或在模型中加入复杂操作时,可能会需要验证该模型或操作是否可导,即模型是否能够优化,在PyTorch框架下,我们可以使用torch.autograd.gradcheck函数来实现这一功能。

首先看一下官方文档中关于该函数的介绍:

PyTorch 如何检查模型梯度是否可导

PyTorch 如何检查模型梯度是否可导

可以看到官方文档中介绍了该函数基于何种方法,以及其参数列表,下面给出几个例子介绍其使用方法,注意:

Tensor需要是双精度浮点型且设置requires_grad = True

第一个例子:检查某一操作是否可导

  1. from torch.autograd import gradcheck
  2. import torch
  3. import torch.nn as nn
  4.  
  5. inputs = torch.randn((10, 5), requires_grad=True, dtype=torch.double)
  6. linear = nn.Linear(5, 3)
  7. linear = linear.double()
  8. test = gradcheck(lambda x: linear(x), inputs)
  9. print("Are the gradients correct: ", test)

输出为:

Are the gradients correct: True

第二个例子:检查某一网络模型是否可导

  1. from torch.autograd import gradcheck
  2. import torch
  3. import torch.nn as nn
  4. # 定义神经网络模型
  5. class Net(nn.Module):
  6.  
  7. def __init__(self):
  8. super(Net, self).__init__()
  9. self.net = nn.Sequential(
  10. nn.Linear(15, 30),
  11. nn.ReLU(),
  12. nn.Linear(30, 15),
  13. nn.ReLU(),
  14. nn.Linear(15, 1),
  15. nn.Sigmoid()
  16. )
  17.  
  18. def forward(self, x):
  19. y = self.net(x)
  20. return y
  21.  
  22. net = Net()
  23. net = net.double()
  24. inputs = torch.randn((10, 15), requires_grad=True, dtype=torch.double)
  25. test = gradcheck(net, inputs)
  26. print("Are the gradients correct: ", test)

输出为:

Are the gradients correct: True

二、Pytorch求导

1.标量对矩阵求导

PyTorch 如何检查模型梯度是否可导

验证:

  1. >>>import torch
  2. >>>a = torch.tensor([[1],[2],[3.],[4]]) # 4*1列向量
  3. >>>X = torch.tensor([[1,2,3],[5,6,7],[8,9,10],[5,4,3.]],requires_grad=True) #4*3矩阵,注意,值必须要是float类型
  4. >>>b = torch.tensor([[2],[3],[4.]]) #3*1列向量
  5. >>>f = a.view(1,-1).mm(X).mm(b) # f = a^T.dot(X).dot(b)
  6. >>>f.backward()
  7. >>>X.grad #df/dX = a.dot(b^T)
  8. tensor([[ 2., 3., 4.],
  9. [ 4., 6., 8.],
  10. [ 6., 9., 12.],
  11. [ 8., 12., 16.]])
  12. >>>a.grad b.grad # a和b的requires_grad都为默认(默认为False),所以求导时,没有梯度
  13. (None, None)
  14. >>>a.mm(b.view(1,-1)) # a.dot(b^T)
  15. tensor([[ 2., 3., 4.],
  16. [ 4., 6., 8.],
  17. [ 6., 9., 12.],
  18. [ 8., 12., 16.]])

2.矩阵对矩阵求导

PyTorch 如何检查模型梯度是否可导PyTorch 如何检查模型梯度是否可导

验证:

  1. >>>A = torch.tensor([[1,2],[3,4.]]) #2*2矩阵
  2. >>>X = torch.tensor([[1,2,3],[4,5.,6]],requires_grad=True) # 2*3矩阵
  3. >>>F = A.mm(X)
  4. >>>F
  5. tensor([[ 9., 12., 15.],
  6. [19., 26., 33.]], grad_fn=<MmBackward>)
  7. >>>F.backgrad(torch.ones_like(F)) # 注意括号里要加上这句
  8. >>>X.grad
  9. tensor([[4., 4., 4.],
  10. [6., 6., 6.]])

注意:

requires_grad为True的数组必须是float类型

进行backgrad的必须是标量,如果是向量,必须在后面括号里加上torch.ones_like(X)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/tszupup/article/details/112916388