主頁(yè) > 知識(shí)庫(kù) > PyTorch 如何檢查模型梯度是否可導(dǎo)

PyTorch 如何檢查模型梯度是否可導(dǎo)

熱門標(biāo)簽:ai電銷機(jī)器人的優(yōu)勢(shì) 商家地圖標(biāo)注海報(bào) 打電話機(jī)器人營(yíng)銷 騰訊地圖標(biāo)注沒(méi)法顯示 地圖標(biāo)注自己和別人標(biāo)注區(qū)別 孝感營(yíng)銷電話機(jī)器人效果怎么樣 聊城語(yǔ)音外呼系統(tǒng) 南陽(yáng)打電話機(jī)器人 海外網(wǎng)吧地圖標(biāo)注注冊(cè)

一、PyTorch 檢查模型梯度是否可導(dǎo)

當(dāng)我們構(gòu)建復(fù)雜網(wǎng)絡(luò)模型或在模型中加入復(fù)雜操作時(shí),可能會(huì)需要驗(yàn)證該模型或操作是否可導(dǎo),即模型是否能夠優(yōu)化,在PyTorch框架下,我們可以使用torch.autograd.gradcheck函數(shù)來(lái)實(shí)現(xiàn)這一功能。

首先看一下官方文檔中關(guān)于該函數(shù)的介紹:

可以看到官方文檔中介紹了該函數(shù)基于何種方法,以及其參數(shù)列表,下面給出幾個(gè)例子介紹其使用方法,注意:

Tensor需要是雙精度浮點(diǎn)型且設(shè)置requires_grad = True

第一個(gè)例子:檢查某一操作是否可導(dǎo)

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

第二個(gè)例子:檢查某一網(wǎng)絡(luò)模型是否可導(dǎo)

from torch.autograd import gradcheck
import torch
import torch.nn as nn 
# 定義神經(jīng)網(wǎng)絡(luò)模型
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求導(dǎo)

1.標(biāo)量對(duì)矩陣求導(dǎo)

驗(yàn)證:

>>>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都為默認(rèn)(默認(rèn)為False),所以求導(dǎo)時(shí),沒(méi)有梯度
(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.矩陣對(duì)矩陣求導(dǎo)

驗(yàn)證:

>>>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)) # 注意括號(hào)里要加上這句
>>>X.grad
tensor([[4., 4., 4.],
    [6., 6., 6.]])

注意:

requires_grad為True的數(shù)組必須是float類型

進(jìn)行backgrad的必須是標(biāo)量,如果是向量,必須在后面括號(hào)里加上torch.ones_like(X)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Pytorch通過(guò)保存為ONNX模型轉(zhuǎn)TensorRT5的實(shí)現(xiàn)
  • pytorch_pretrained_bert如何將tensorflow模型轉(zhuǎn)化為pytorch模型
  • pytorch模型的保存和加載、checkpoint操作
  • 解決Pytorch修改預(yù)訓(xùn)練模型時(shí)遇到key不匹配的情況
  • pytorch 預(yù)訓(xùn)練模型讀取修改相關(guān)參數(shù)的填坑問(wèn)題
  • PyTorch模型轉(zhuǎn)TensorRT是怎么實(shí)現(xiàn)的?

標(biāo)簽:六盤水 撫州 楊凌 迪慶 聊城 牡丹江 揚(yáng)州 南寧

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PyTorch 如何檢查模型梯度是否可導(dǎo)》,本文關(guān)鍵詞  PyTorch,如何,檢查,模型,梯度,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PyTorch 如何檢查模型梯度是否可導(dǎo)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于PyTorch 如何檢查模型梯度是否可導(dǎo)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章