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

Posted

技术标签:

【中文标题】ValueError:尝试共享变量 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 【发布时间】:2017-11-20 18:14:18 【问题描述】:

这是代码:

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: 尝试共享变量 rnn/multi_rnn_cell/cell_0/basic_lstm_cell/kernel,但指定了形状 (1024, 2048) 并找到了形状 (513, 2048)。

我使用的是 GPU 版本的 tensorflow。

【问题讨论】:

【参考方案1】:

我在升级到 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)

【讨论】:

【参考方案2】:

我猜这是因为 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)

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

【讨论】:

【参考方案3】:

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 建议的方法几乎相同,但形式可能更优雅一些。

【讨论】:

【参考方案4】:

我在使用 Google Colab 的 Jupiter notebook 时遇到了同样的问题。我通过重启内核然后重新运行代码解决了这个问题。

【讨论】:

一旦你重新启动内核,你只需要再次重新运行导入。

以上是关于ValueError:尝试共享变量 rnn/multi_rnn_cell/cell_0/basic_lstm_cell/kernel的主要内容,如果未能解决你的问题,请参考以下文章

Python CodeLab 关于异常的问题——尝试,除了 ValueError

获取 ValueError:在尝试运行 Adjt 时发现样本数量不一致的输入变量:[248, 1239]。 R 平方和 RMSE

当我尝试为 scikit-learn 模型拟合另外 1 个功能时,出现此错误“ValueError:找到样本数量不一致的输入变量”

ValueError:没有为任何变量提供梯度 - Tensorflow 2.0/Keras

Tensorflow Autoencoder ValueError:没有为任何变量提供梯度

ValueError:发现样本数量不一致的输入变量:[100, 300]