ValueError: Trying to share variable rnn/multi_rnn_cell/cell_0/basic_lstm_cell/kernel
ValueError: Trying to share variable rnn/multi_rnn_cell/cell_0/basic_lstm_cell/kernel
这是代码:
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。
我升级到v1.2(tensorflow-gpu)的时候遇到了类似的问题。
我没有使用 [rnn_cell]*3
,而是通过循环创建了 3 rnn_cells
(stacked_rnn)(这样它们就不会共享变量)并用 stacked_rnn
喂 MultiRNNCell
问题就消失了。我不确定这样做是否正确。
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 层中每一层的 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)
然后我就可以在没有这个错误的情况下训练我的数据。
我不确定我的猜测是否正确,但它对我有用。希望对你有用。
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
实际上,它几乎与 Wasi Ahmad 和 Maosi Chen 上面建议的方法相同,但形式可能更优雅一些。
我在使用 Google Colab Jupyter notebook 时遇到了同样的问题。我通过重新启动内核然后重新运行代码解决了这个问题。
这是代码:
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。
我升级到v1.2(tensorflow-gpu)的时候遇到了类似的问题。
我没有使用 [rnn_cell]*3
,而是通过循环创建了 3 rnn_cells
(stacked_rnn)(这样它们就不会共享变量)并用 stacked_rnn
喂 MultiRNNCell
问题就消失了。我不确定这样做是否正确。
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 层中每一层的 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)
然后我就可以在没有这个错误的情况下训练我的数据。 我不确定我的猜测是否正确,但它对我有用。希望对你有用。
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
实际上,它几乎与 Wasi Ahmad 和 Maosi Chen 上面建议的方法相同,但形式可能更优雅一些。
我在使用 Google Colab Jupyter notebook 时遇到了同样的问题。我通过重新启动内核然后重新运行代码解决了这个问题。