2017-09-24 51 views
0

我想在張量流中寫一個簡單的RNN,基於這裏的教程:https://danijar.com/introduction-to-recurrent-networks-in-tensorflow/ (我使用簡單的RNN細胞而不是GRU,而不是使用丟失)。Tensorflow RNN細胞有不同的權重

我很困惑,因爲我序列中的不同RNN細胞似乎被分配了不同的權重。如果我運行下面的代碼

import tensorflow as tf 

seq_length = 3 
n_h = 100 # Number of hidden units 
n_x = 26 # Size of input layer 
n_y = 26 # Size of output layer 

inputs = tf.placeholder(tf.float32, [None, seq_length, n_x]) 

cells = [] 
for _ in range(seq_length): 
    cell = tf.contrib.rnn.BasicRNNCell(n_h) 
    cells.append(cell) 
multi_rnn_cell = tf.contrib.rnn.MultiRNNCell(cells) 

initial_state = tf.placeholder(tf.float32, [None, n_h]) 

outputs_h, output_final_state = tf.nn.dynamic_rnn(multi_rnn_cell, inputs, dtype=tf.float32) 

sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 

print('Trainable variables:') 
for v in tf.trainable_variables(): 
    print(v) 

如果我在Python 3運行它,我得到以下的輸出:

Trainable variables: 
<tf.Variable 'rnn/multi_rnn_cell/cell_0/basic_rnn_cell/kernel:0' shape=(126, 100) dtype=float32_ref> 
<tf.Variable 'rnn/multi_rnn_cell/cell_0/basic_rnn_cell/bias:0' shape=(100,) dtype=float32_ref> 
<tf.Variable 'rnn/multi_rnn_cell/cell_1/basic_rnn_cell/kernel:0' shape=(200, 100) dtype=float32_ref> 
<tf.Variable 'rnn/multi_rnn_cell/cell_1/basic_rnn_cell/bias:0' shape=(100,) dtype=float32_ref> 
<tf.Variable 'rnn/multi_rnn_cell/cell_2/basic_rnn_cell/kernel:0' shape=(200, 100) dtype=float32_ref> 
<tf.Variable 'rnn/multi_rnn_cell/cell_2/basic_rnn_cell/bias:0' shape=(100,) dtype=float32_ref> 

首先,這不是我想要的東西 - 一個RNN需要有從每個圖層的輸入到隱藏和隱藏到隱藏的權重相同!

其次,我並不真正瞭解爲什麼我得到所有這些單獨的變量。如果我查看source code for rnn cells,它看起來像BasicRNNCell應該調用_linear,它應該查找名稱爲_WEIGHTS_VARIABLE_NAME(全局設置爲"kernel")的變量是否存在,如果是,則使用它。我不明白"kernel"如何裝飾到"rnn/multi_rnn_cell/cell_0/basic_rnn_cell/kernel:0"

如果有人能解釋我做錯了什麼,我會非常感激。

回答

2

注意區分兩個不同的事情:循環遞歸神經網絡的層數和RNN通過後向傳播時間算法展開處理序列長度的時間數。

在您的代碼:

  • MultiCellRNN被照顧創建一個3層RNN的(你正在創建三層那裏,MultiCellRNN只是一個包裝,以使更容易對付他們)
  • tf.nn.dynamic_rnn正在照顧這個三層網絡多次與您的序列長度有關
+0

我明白了!感謝你 - 現在你已經指出了這一點。 –