欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-10 14:21:49
一、pytorch 检查模型梯度是否可导当我们构建复杂网络模型或在模型中加入复杂操作时,可能会需要验证该模型或操作是否可导,即模型是否能够优化,在pytorch框架下,我们可以使用torch.auto...

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

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

首先看一下中关于该函数的介绍:

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

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

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

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.标量对矩阵求导

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

验证:

>>>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.矩阵对矩阵求导

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

验证:

>>>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)

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