2016-12-23 38 views
0

我有一套在matlab中實現的訓練模型的權重。我想將權重移交給tensorflow。然而,具有500個單元的tf.rnn.rnn_cell.LSTMCell具有形狀的權重矩陣(1524,2000)。爲什麼1524?爲什麼是2000?這完全不符合我的權重的大小。如何將權重轉移到張量流RNN單元

我的模型有3個隱藏層,每層都有1000個節點,最後一個隱藏層是時間層(復現)。輸入尺寸爲1539.輸出尺寸爲1026. 時間層具有1x1000時間權重和1000x1000圖層權重,1x1000用於偏差。

import scipy 
import numpy as np 
import tensorflow as tf 

x = tf.placeholder(shape=[None, 3, 1024], dtype=tf.float32, name='input') 
cell = tf.nn.rnn_cell.LSTMCell(500) 
output, state = tf.nn.dynamic_rnn(cell, x, dtype=tf.float32) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    var = [x for x in tf.trainable_variables() if x.name=='RNN/LSTMCell/W_0:0'] 
    val = sess.run(var) 
    # why 1524x2000? 
    print(val[0].shape) 

回答

1

看起來你是用x作爲輸入來調用你的單元格。權重矩陣的大小將是(500 + 1024)x(4 * 500)。 LSTM有四個門控功能,但出於效率的原因,它們各自的矩陣連接在一起。這就是爲什麼矩陣的第二維是4 * 500的原因。第一維是單元格的大小加上輸入的大小,因爲它需要與來自前一步的輸出連接的輸入相乘。

+0

因此,我可以使用我的預訓練的權重?權重矩陣的形狀是不同的......我應該自己實現一種新的單元,而不是繼續使用內置的LSTMCell? –

+0

該matlab代碼不使用神經網絡的任何工具箱。它似乎沒有使用任何像LSTM –

+0

謝謝,我不知道有BasicRNNCell可用。但它也有一個拼接權重矩陣。我想我幾乎可以得到它。只需要看看BasicRNNCell的實現 –

0

第一轉換您的預訓練的權重爲張量,這可以通過讀取一個文件,其中包含你的權重,並使用weights = tf.convert_to_tensor(your_weights)

然後找到你的LSTM電池重量的名稱(這可以通過列表來完成所有OPS完成該圖)

最後使用tf.train.import_meta_graph(meta_graph_def=your_meta_graph_def, input_map={"lstm-cell-weights-name": weights})(最重要的是input_map參數)

僅適用於版本0.12後。

,因爲舊版本不支持input_map參數

相關問題