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)
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- PyTorch 如何自動計算梯度
- pytorch_detach 切斷網絡反傳方式
- Pytorch中的backward()多個loss函數用法
- pytorch 如何打印網絡回傳梯度
- PyTorch中Tensor和tensor的區別及說明