Импорт LSTM из Tensorflow в PyTorch вручную - PullRequest
2 голосов
/ 18 марта 2019

Я пытаюсь импортировать предварительно обученную модель из тензорного потока в PyTorch. Он принимает один вход и отображает его на один выход. Путаница возникает, когда я пытаюсь импортировать веса LSTM

Я читаю веса и их переменные из файла с помощью следующей функции:

def load_tf_model_weights():        

    modelpath = 'models/model1.ckpt.meta'

    with tf.Session() as sess:        
        tf.train.import_meta_graph(modelpath) 
        init = tf.global_variables_initializer()
        sess.run(init)  
        vars = tf.trainable_variables()        
        W = sess.run(vars)

    return W,vars

W,V = load_tf_model_weights()

Затем я проверяю формы весов

In [33]:  [w.shape for w in W]
Out[33]: [(51, 200), (200,), (100, 200), (200,), (50, 1), (1,)]

кроме того, переменные определены как

In [34]:    V
Out[34]: 
[<tf.Variable 'rnn/multi_rnn_cell/cell_0/lstm_cell/kernel:0' shape=(51, 200) dtype=float32_ref>,
<tf.Variable 'rnn/multi_rnn_cell/cell_0/lstm_cell/bias:0' shape=(200,) dtype=float32_ref>,
<tf.Variable 'rnn/multi_rnn_cell/cell_1/lstm_cell/kernel:0' shape=(100, 200) dtype=float32_ref>,
<tf.Variable 'rnn/multi_rnn_cell/cell_1/lstm_cell/bias:0' shape=(200,) dtype=float32_ref>,
<tf.Variable 'weight:0' shape=(50, 1) dtype=float32_ref>,
<tf.Variable 'FCLayer/Variable:0' shape=(1,) dtype=float32_ref>]

Итак, я могу сказать, что первый элемент W определяет ядро ​​LSTM, а второй элемент определяет его смещение. Согласно этой записи форма для ядра определяется как [input_depth + h_depth, 4 * self._num_units] и уклон как [4 * self._num_units]. Мы уже знаем, что input_depth это 1. Таким образом, мы получаем, что h_depth и _num_units оба имеют значение 50.

В pytorch мой LSTMCell, которому я хочу присвоить веса, выглядит так:

In [38]: cell = nn.LSTMCell(1,50)
In [39]: [p.shape for p in cell.parameters()]
Out[39]: 
[torch.Size([200, 1]),
torch.Size([200, 50]),
torch.Size([200]),
torch.Size([200])]

Первые две записи могут быть покрыты первым значением W, которое имеет форму (51,200). Но LSTMCell из Tensorflow выдает только один уклон формы (200), тогда как pytorch хочет два из них

И, оставив предвзятость, у меня остались веса:

cell2 = nn.LSTMCell(1,50,bias=False)
[p.shape for p in cell2.parameters()]
Out[43]: [torch.Size([200, 1]), torch.Size([200, 50])]

Спасибо!

1 Ответ

1 голос
/ 19 марта 2019

Pytorch использует подстилающий слой CuDNN LSTM (даже если у вас нет CUDA, он все еще использует что-то совместимое), таким образом, у него есть один дополнительный термин смещения.

Таким образом, вы можете выбрать два числа с их суммой, равной 1 (0 и 1, 1/2 и 1/2 или что-нибудь еще), и установить ваши смещения в качестве числа, умноженного на смещение TF.

pytorch_bias_1 = torch.from_numpy(alpha * tf_bias_data)
pytorch_bias_2 = torch.from_numpy((1.0-alpha) * tf_bias_data)
...