PyTorch: pasando una matriz numpy para inicializar el peso

Me gustaría inicializar los parámetros de RNN con np arrays.

En el siguiente ejemplo, quiero pasar w a los parámetros de rnn . Sé que pytorch proporciona muchos métodos de inicialización como Xavier, uniforme, etc., pero ¿hay alguna manera de inicializar los parámetros pasando matrices de números?

 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) 

Primero, nn.RNN que nn.RNN tiene más de una variable de peso, consulte la documentación :

Variables:

  • weight_ih_l[k] – los pesos ocultos por entrada aprendibles de la capa kk , de forma (hidden_size * input_size) para k = 0 . De lo contrario, la forma es (hidden_size * hidden_size)
  • weight_hh_l[k] : los pesos oculta-ocultos que se pueden aprender de la k(hidden_size * hidden_size) capa, de forma (hidden_size * hidden_size)
  • bias_ih_l[k] : la polarización oculta de entrada que se puede bias_ih_l[k] de la k(hidden_size) capa, de forma (hidden_size)
  • bias_hh_l[k] : el sesgo oculto oculto que se puede aprender de la k(hidden_size) capa, de la forma (hidden_size)

Ahora, cada una de estas variables (instancias de Parameter ) son atributos de su instancia nn.RNN . Puede acceder a ellos y editarlos de dos maneras, como se muestra a continuación:

  • Solución 1: Accediendo a todos los atributos del Parameter RNN por nombre ( rnn.weight_hh_lK , rnn.weight_ih_lK , etc.):
 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)) 
  • Solución 2: Accediendo a todos los atributos del Parameter RNN a través del rnn.all_weights lista rnn.all_weights :
 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) 

Como se proporciona una respuesta detallada, solo para agregar una oración más. Los parámetros de un nn.Module son Tensores (anteriormente, solían ser variables de autograd, que se deperaban en Pytorch 0.4 ). Por lo tanto, esencialmente necesita usar el método torch.from_numpy() para convertir la matriz Numpy a Tensor y luego usarlos para inicializar los parámetros nn.Module .