【问题标题】:PyTorch: passing numpy array for weight initializationPyTorch:传递 numpy 数组进行权重初始化
【发布时间】:2019-01-08 17:58:24
【问题描述】:

我想用np数组初始化RNN的参数。

在下面的示例中,我想将w 传递给rnn 的参数。我知道pytorch提供了很多初始化方法,比如Xavier、uniform等,但是有没有办法通过传递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)

【问题讨论】:

    标签: python numpy initialization pytorch rnn


    【解决方案1】:

    由于提供了详细的答案,我只是再补充一句。 nn.Module 的参数是张量(以前,它曾经是 autograd 变量,which is deperecated in Pytorch 0.4)。所以,本质上你需要使用torch.from_numpy()方法将Numpy数组转换为Tensor,然后用它们来初始化nn.Module参数。

    【讨论】:

      【解决方案2】:

      首先,让我们注意nn.RNN 有多个权重变量,c.f。 documentation:

      变量:

      • weight_ih_l[k]——k-th 层的可学习输入隐藏权重,形状为(hidden_size * input_size),用于k = 0。否则, 形状是(hidden_size * hidden_size)
      • weight_hh_l[k]k-th 层的可学习隐藏权重,形状为 (hidden_size * hidden_size)
      • bias_ih_l[k]k-th 层的可学习输入隐藏偏差,形状为 (hidden_size)
      • bias_hh_l[k]k-th 层的可学习的隐藏-隐藏偏差,形状为 (hidden_size)

      现在,每个变量(Parameter 实例)都是您的 nn.RNN 实例的属性。您可以通过两种方式访问​​和编辑它们,如下所示:

      • 解决方案 1:按名称(rnn.weight_hh_lKrnn.weight_ih_lK 等)访问所有 RNN Parameter 属性:
      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列表属性访问所有RNN Parameter属性:
      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)
      

      【讨论】:

      • GRU/LSTM 会是什么样子?
      猜你喜欢
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 2019-07-21
      相关资源
      最近更新 更多