ValueError:尝试共享变量rnn/multi_rnn_cell/cell_0/basic_lstm_cell/kernel

Par*_*roi 19 deep-learning lstm tensorflow

这就是代码:

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)
Run Code Online (Sandbox Code Playgroud)

这是完整的错误:

ValueError:尝试共享变量rnn/multi_rnn_cell/cell_0/basic_lstm_cell/kernel,但指定形状(1024,2048)并找到形状(513,2048).

我正在使用GPU版本的tensorflow.

Mao*_*hen 30

我升级到v1.2(tensorflow-gpu)时遇到了类似的问题.[rnn_cell]*3我没有使用,而是rnn_cells通过循环创建了3 (stacked_rnn)(因此它们不共享变量)并且MultiRNNCell使用了源代码stacked_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)
Run Code Online (Sandbox Code Playgroud)


小智 14

官方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)])
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到它:https://www.tensorflow.org/tutorials/recurrent

实际上它与Wasi Ahmad和Maosi Chen提出的几乎相同的方法,但也许更优雅的形式.


Jac*_* Lv 5

我想这是因为你的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)
Run Code Online (Sandbox Code Playgroud)

然后我能够在没有这个错误的情况下训练我的数据.我不确定我的猜测是否正确,但它对我有用.希望对你有效.