PyTorchはどうやってモデルの勾配が導けるかどうかを調べます。
一、PyTorchはモデルの勾配が導けるかどうかを検査する。
複雑なネットワークモデルを構築したり、モデルに複雑な操作を加えると、モデルまたは動作が可能かどうかを検証する必要があるかもしれません。すなわち、モデルが最適化されているかどうかは、PyTorchフレームワークの下で、touch.atogradcheck関数を使用して実現できます。
まず、公式文書の関数について紹介します。
公式文書では、この関数がどのような方法に基づいているか、およびそのパラメータリストを紹介しています。以下、いくつかの例を示して、その使用方法を紹介します。
Tensorは二重精度浮動小数点型で、かつrequires_を設定する必要があります。grad=True
第一の例:ある操作が導けるかどうかを確認する。
Aree the gradients corect:True
第二の例:あるネットワークモデルが導けるかどうかを確認する。
Aree the gradients corect:True
二、Pytouchの指導を求める
1.スカラー対マトリックスのコンダクタンス
認証:
認証:
requires_gradがTrueの配列である必要があります。floatタイプです。
backgradを行うにはスカラーが必要です。ベクトルであれば、後ろの括弧リガでtouch.ones_like(X)
以上は個人の経験ですので、参考にしていただければと思います。
複雑なネットワークモデルを構築したり、モデルに複雑な操作を加えると、モデルまたは動作が可能かどうかを検証する必要があるかもしれません。すなわち、モデルが最適化されているかどうかは、PyTorchフレームワークの下で、touch.atogradcheck関数を使用して実現できます。
まず、公式文書の関数について紹介します。
公式文書では、この関数がどのような方法に基づいているか、およびそのパラメータリストを紹介しています。以下、いくつかの例を示して、その使用方法を紹介します。
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)
出力:Aree the gradients corect: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)
出力:Aree the gradients corect:True
二、Pytouchの指導を求める
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を行うにはスカラーが必要です。ベクトルであれば、後ろの括弧リガでtouch.ones_like(X)
以上は個人の経験ですので、参考にしていただければと思います。