我想在張量流中寫一個簡單的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"
。
如果有人能解釋我做錯了什麼,我會非常感激。
我明白了!感謝你 - 現在你已經指出了這一點。 –