web-dev-qa-db-ja.com

torch.nn.Parameterを理解する

私はpytorchが初めてで、torch.nn.Parameter()がどのように機能するかを理解するのが困難です。

https://pytorch.org/docs/stable/nn.html のドキュメントを読み終えましたが、ほとんど意味がありません。

誰か助けてくれますか?

私が取り組んでいるコードスニペット:

def __init__(self, weight):
    super(Net, self).__init__()
    # initializes the weights of the convolutional layer to be the weights of the 4 defined filters
    k_height, k_width = weight.shape[2:]
    # assumes there are 4 grayscale filters
    self.conv = nn.Conv2d(1, 4, kernel_size=(k_height, k_width), bias=False)
    self.conv.weight = torch.nn.Parameter(weight)
22
Vineet Pandey

分解します。ご存知かもしれませんが、テンソルは多次元行列です。パラメータは、その生の形式では、テンソル、つまり多次元行列です。 Variableクラスをサブクラス化します。

変数とパラメーターの違いは、モジュールに関連付けられている場合に発生します。パラメーターがモデル属性としてモジュールに関連付けられている場合、パラメーターリストに自動的に追加され、「パラメーター」イテレーターを使用してアクセスできます。

最初にトーチでは、変数(たとえば、中間状態である可能性があります)も割り当て時にモデルのパラメーターとして追加されます。後に、変数をパラメーターリストに追加する代わりにキャッシュする必要性が特定されたユースケースが特定されました。

そのようなケースの1つは、ドキュメントで言及されているように、最後の非表示状態を保存する必要があるため、何度もパスする必要がないRNNの場合です。モデルにパラメーターとして自動的に登録するのではなく、変数をキャッシュする必要があるのは、モデルにパラメーターを登録する明示的な方法、つまりnn.Parameterクラスがある理由です。

たとえば、次のコードを実行します-

import torch
import torch.nn as nn
from torch.optim import Adam

class NN_Network(nn.Module):
    def __init__(self,in_dim,hid,out_dim):
        super(NN_Network, self).__init__()
        self.linear1 = nn.Linear(in_dim,hid)
        self.linear2 = nn.Linear(hid,out_dim)
        self.linear1.weight = torch.nn.Parameter(torch.zeros(in_dim,hid))
        self.linear1.bias = torch.nn.Parameter(torch.ones(hid))
        self.linear2.weight = torch.nn.Parameter(torch.zeros(in_dim,hid))
        self.linear2.bias = torch.nn.Parameter(torch.ones(hid))

    def forward(self, input_array):
        h = self.linear1(input_array)
        y_pred = self.linear2(h)
        return y_pred

in_d = 5
hidn = 2
out_d = 3
net = NN_Network(in_d, hidn, out_d)

次に、このモデルに関連付けられているパラメーターリストを確認します-

for param in net.parameters():
    print(type(param.data), param.size())

""" Output
<class 'torch.FloatTensor'> torch.Size([5, 2])
<class 'torch.FloatTensor'> torch.Size([2])
<class 'torch.FloatTensor'> torch.Size([5, 2])
<class 'torch.FloatTensor'> torch.Size([2])
"""

または試して、

list(net.parameters())

これはオプティマイザーに簡単に入力できます-

opt = Adam(net.parameters(), learning_rate=0.001)

また、パラメータにはrequire_gradがデフォルトで設定されていることに注意してください。

49
Astha Sharma

最近のPyTorchリリースにはテンソルがあり、変数の概念は非推奨になりました。

パラメータ は、(モジュールコンストラクタ__init__メソッドで)定義されているモジュールに限定されたテンソルです。

それらはmodule.parameters()内に表示されます。これは、これらのパラメーターの勾配降下のおかげで学習するカスタムモジュールを構築するときに便利です。

パラメーターはテンソルであるため、PyTorchテンソルに当てはまるものはすべてパラメーターに当てはまります。

さらに、モジュールがGPUに移行する場合、パラメーターも同様に移行します。モジュールが保存されている場合、パラメータも保存されます。

buffers と呼ばれるモデルパラメーターと同様の概念があります。

これらはモジュール内のテンソルと呼ばれますが、これらのテンソルは勾配降下を介して学習することを意図したものではなく、代わりに変数のようなものと考えることができます。モジュールforward()内の名前付きバッファを好きなように更新します。

バッファの場合、モジュールとともにGPUに移動し、モジュールとともに保存されることも事実です。

enter image description here

3
prosti