web-dev-qa-db-ja.com

PyTorch:重みの初期化のためにnumpy配列を渡す

Np配列でRNNのパラメータを初期化したいのですが。

次の例では、wrnnのパラメーターに渡します。 pytorchがXavierやユニフォームなどの多くの初期化メソッドを提供していることは知っていますが、numpy配列を渡すことでパラメーターを初期化する方法はありますか?

import numpy as np
import torch as nn
rng = np.random.RandomState(313)
w = rng.randn(input_size, hidden_size).astype(np.float32)

rnn = nn.RNN(input_size, hidden_size, num_layers)
7
ytrewq

まず、nn.RNNには複数の重み変数c.fがあることに注意してください。 ドキュメント

変数:

  • weight_ih_l[k](hidden_size * input_size)の形状k = 0k番目の層の学習可能な入力非表示の重み。それ以外の場合、形状は(hidden_size * hidden_size)です。
  • weight_hh_l[k] –形状(hidden_size * hidden_size)k番目のレイヤーの学習可能な非表示の重み
  • bias_ih_l[k] –形状(hidden_size)k番目の層の学習可能な入力隠しバイアス
  • bias_hh_l[k] –形状(hidden_size)k番目の層の学習可能な隠れた隠れたバイアス

これで、これらの各変数( Parameter インスタンス)は、nn.RNNインスタンスの属性になります。以下に示すように、2つの方法でそれらにアクセスして編集できます。

  • 解決策1:名前ですべてのRNN Parameter属性にアクセスする(rnn.weight_hh_lKrnn.weight_ih_lKなど):
import torch
from torch import nn
import numpy as np

input_size, hidden_size, num_layers = 3, 4, 2
use_bias = True
rng = np.random.RandomState(313)

rnn = nn.RNN(input_size, hidden_size, num_layers, bias=use_bias)

def set_nn_parameter_data(layer, parameter_name, new_data):
    param = getattr(layer, parameter_name)
    param.data = new_data

for i in range(num_layers):
    weights_hh_layer_i = rng.randn(hidden_size, hidden_size).astype(np.float32)
    weights_ih_layer_i = rng.randn(hidden_size, hidden_size).astype(np.float32)
    set_nn_parameter_data(rnn, "weight_hh_l{}".format(i), 
                          torch.from_numpy(weights_hh_layer_i))
    set_nn_parameter_data(rnn, "weight_ih_l{}".format(i), 
                          torch.from_numpy(weights_ih_layer_i))

    if use_bias:
        bias_hh_layer_i = rng.randn(hidden_size).astype(np.float32)
        bias_ih_layer_i = rng.randn(hidden_size).astype(np.float32)
        set_nn_parameter_data(rnn, "bias_hh_l{}".format(i), 
                              torch.from_numpy(bias_hh_layer_i))
        set_nn_parameter_data(rnn, "bias_ih_l{}".format(i), 
                              torch.from_numpy(bias_ih_layer_i))
  • 解決策2:rnn.all_weightsリスト属性を介してすべてのRNNParameter属性にアクセスする:
import torch
from torch import nn
import numpy as np

input_size, hidden_size, num_layers = 3, 4, 2
use_bias = True
rng = np.random.RandomState(313)

rnn = nn.RNN(input_size, hidden_size, num_layers, bias=use_bias)

for i in range(num_layers):
    weights_hh_layer_i = rng.randn(hidden_size, hidden_size).astype(np.float32)
    weights_ih_layer_i = rng.randn(hidden_size, hidden_size).astype(np.float32)
    rnn.all_weights[i][0].data = torch.from_numpy(weights_ih_layer_i)
    rnn.all_weights[i][1].data = torch.from_numpy(weights_hh_layer_i)

    if use_bias:
        bias_hh_layer_i = rng.randn(hidden_size).astype(np.float32)
        bias_ih_layer_i = rng.randn(hidden_size).astype(np.float32)
        rnn.all_weights[i][2].data = torch.from_numpy(bias_ih_layer_i)
        rnn.all_weights[i][3].data = torch.from_numpy(bias_hh_layer_i)
3
benjaminplanche

詳細な回答がありますので、もう一文追加します。 _nn.Module_のパラメーターはテンソルです(以前は、autograd変数でした Pytorch 0.4で廃止されました )。したがって、基本的には、torch.from_numpy()メソッドを使用してNumpy配列をTensorに変換し、それらを使用して_nn.Module_パラメーターを初期化する必要があります。

2
Wasi Ahmad