您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:PyTorch 如何检查模型梯度是否可导

51自学网 2021-10-30 22:31:07
  python
这篇教程PyTorch 如何检查模型梯度是否可导写得很实用,希望能帮到您。

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

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

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

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

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

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

from torch.autograd import gradcheckimport torchimport torch.nn as nn inputs = torch.randn((10, 5), requires_grad=True, dtype=torch.double)linear = nn.Linear(5, 3)linear = linear.double()test = gradcheck(lambda x: linear(x), inputs)print("Are the gradients correct: ", test)

输出为:

Are the gradients correct: True

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

from torch.autograd import gradcheckimport torchimport torch.nn as nn # 定义神经网络模型class Net(nn.Module):     def __init__(self):        super(Net, self).__init__()        self.net = nn.Sequential(            nn.Linear(15, 30),            nn.ReLU(),            nn.Linear(30, 15),            nn.ReLU(),            nn.Linear(15, 1),            nn.Sigmoid()        )     def forward(self, x):        y = self.net(x)        return y net = Net()net = net.double()inputs = torch.randn((10, 15), requires_grad=True, dtype=torch.double)test = gradcheck(net, inputs)print("Are the gradients correct: ", test)

输出为:

Are the gradients correct: True

二、Pytorch求导

1.标量对矩阵求导

在这里插入图片描述

验证:

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

2.矩阵对矩阵求导

在这里插入图片描述 在这里插入图片描述

验证:

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

注意:

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

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持51zixue.net。


python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
pytorch 权重weight 与 梯度grad 可视化操作
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。