PyTorch 如何检查模型梯度是否可导
一、PyTorch 检查模型梯度是否可导
当我们构建复杂网络模型或在模型中加入复杂操作时,可能会需要验证该模型或操作是否可导,即模型是否能够优化,在PyTorch框架下,我们可以使用torch.autograd.gradcheck函数来实现这一功能。
首先看一下官方文档中关于该函数的介绍:
可以看到官方文档中介绍了该函数基于何种方法,以及其参数列表,下面给出几个例子介绍其使用方法,注意:
Tensor需要是双精度浮点型且设置requires_grad = True
第一个例子:检查某一操作是否可导
from torch.autograd import gradcheck import torch import 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 gradcheck import torch import 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) >>>F tensor([[ 9., 12., 15.], [19., 26., 33.]], grad_fn=<MmBackward>) >>>F.backgrad(torch.ones_like(F)) # 注意括号里要加上这句 >>>X.grad tensor([[4., 4., 4.], [6., 6., 6.]])
注意:
requires_grad为True的数组必须是float类型
进行backgrad的必须是标量,如果是向量,必须在后面括号里加上torch.ones_like(X)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。
相关文章
pytorch nn.Conv2d()中的padding以及输出大小方式
今天小编就为大家分享一篇pytorch nn.Conv2d()中的padding以及输出大小方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27- 这篇文章主要介绍了PyTorch一小时掌握之迁移学习篇,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-08
Linux安装Pytorch1.8GPU(CUDA11.1)的实现
这篇文章主要介绍了Linux安装Pytorch1.8GPU(CUDA11.1)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-25- 这篇文章主要介绍了Pytorch之扩充tensor的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-05
- 今天小编就为大家分享一篇pytorch 自定义卷积核进行卷积操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-06
- 这篇文章主要介绍了解决pytorch 交叉熵损失输出为负数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-08
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
今天小编就为大家分享一篇pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-02- 这篇文章主要介绍了pytorch 实现冻结部分参数训练另一部分,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-27
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
这篇文章主要介绍了从Pytorch模型pth文件中读取参数成numpy矩阵的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-04Pytorch 的损失函数Loss function使用详解
今天小编就为大家分享一篇Pytorch 的损失函数Loss function使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-02- 今天小编就为大家分享一篇pytorch中的上采样以及各种反操作,求逆操作详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-30
- 这篇文章主要介绍了基于Pytorch版yolov5的滑块验证码破解思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-25
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
今天小编就为大家分享一篇pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-02- 这篇文章主要介绍了pytorch深度学习中对softmax实现进行了详细解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...2021-09-30
- 今天小编就为大家分享一篇Pytorch 计算误判率,计算准确率,计算召回率的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
- 今天小编就为大家分享一篇Pytorch实现LSTM和GRU示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
- 这篇文章主要介绍了Pytorch如何切换 cpu和gpu的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-01
- 今天小编就为大家分享一篇pytorch动态网络以及权重共享实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-29
- 这篇文章主要介绍了解决Pytorch修改预训练模型时遇到key不匹配的情况,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-05
- 这篇文章主要介绍了pytorch中的squeeze函数、cat函数使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-05-20