2017-06-18 140 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陈以上建议但也许有点更优雅。