2017-06-18 142 views
16

這一點,代碼:ValueError異常:想要共享變量RNN/multi_rnn_cell/cell_0/basic_lstm_cell /內核

X = tf.placeholder(tf.float32, [batch_size, seq_len_1, 1], name='X') 
labels = tf.placeholder(tf.float32, [None, alpha_size], name='labels') 

rnn_cell = tf.contrib.rnn.BasicLSTMCell(512) 
m_rnn_cell = tf.contrib.rnn.MultiRNNCell([rnn_cell] * 3, state_is_tuple=True) 
pre_prediction, state = tf.nn.dynamic_rnn(m_rnn_cell, X, dtype=tf.float32) 

這是完全錯誤:

ValueError: Trying to share variable rnn/multi_rnn_cell/cell_0/basic_lstm_cell/kernel, but specified shape (1024, 2048) and found shape (513, 2048).

我使用的是GPU版本tensorflow。

回答

25

當我升級到v1.2(tensorflow-gpu)時,我遇到了類似的問題。 而不是使用[rnn_cell]*3,我創建了3個rnn_cells(stacked_rnn)通過一個循環(以便他們不共享變量),並提供MultiRNNCellstacked_rnn和問題消失。我不確定這是做到這一點的正確方法。

stacked_rnn = [] 
for iiLyr in range(3): 
    stacked_rnn.append(tf.nn.rnn_cell.LSTMCell(num_units=512, state_is_tuple=True)) 
MultiLyr_cell = tf.nn.rnn_cell.MultiRNNCell(cells=stacked_rnn, state_is_tuple=True) 
3

我想這是因爲你的3層的RNN單元共享相同的輸入和輸出形狀。

在第1層上,對於每批次的每個時間戳,輸入維度爲513 = 1(您的x維度)+ 512(隱藏層維度)。

在第2層和第3層上,輸入尺寸爲1024 = 512(前一層的輸出)+ 512(前一時間戳的輸出)。

疊加MultiRNNCell的方式可能意味着3個單元共享相同的輸入和輸出形狀。

我疊起來MultiRNNCell通過命令,宣佈兩個不同類型的細胞,以防止它們共享輸入形狀

rnn_cell1 = tf.contrib.rnn.BasicLSTMCell(512) 
run_cell2 = tf.contrib.rnn.BasicLSTMCell(512) 
stack_rnn = [rnn_cell1] 
for i in range(1, 3): 
    stack_rnn.append(rnn_cell2) 
m_rnn_cell = tf.contrib.rnn.MultiRNNCell(stack_rnn, state_is_tuple = True) 

然後我能訓練我的數據,而這個bug。 我不確定我的猜測是否正確,但對我有用。希望對你有效。

12

官方TensorFlow教程建議多LSTM網絡的定義是這樣的:

def lstm_cell(): 
    return tf.contrib.rnn.BasicLSTMCell(lstm_size) 
stacked_lstm = tf.contrib.rnn.MultiRNNCell(
    [lstm_cell() for _ in range(number_of_layers)]) 

你可以在這裏找到:https://www.tensorflow.org/tutorials/recurrent

實際上它幾乎相同的辦法,瓦斯艾哈邁德和Maosi陳以上建議但也許有點更優雅。