我正在尝试建立一个多元时间序列预测模型。我按照以下教程进行温度预测。 http://nbviewer.jupyter.org/github/addfor/tutorials/blob/master/machine_learning/ml16v04_forecasting_with_LSTM.ipynb

我想通过使用以下代码将他的模型扩展到多层LSTM模型:

cell = tf.contrib.rnn.LSTMCell(hidden, state_is_tuple=True)
cell = tf.contrib.rnn.MultiRNNCell([cell] * num_layers,state_is_tuple=True)
output, _ = tf.nn.dynamic_rnn(cell=cell, inputs=features, dtype=tf.float32)

但我有一个错误说:



当我尝试这个:
cell = []
for i in range(num_layers):
    cell.append(tf.contrib.rnn.LSTMCell(hidden, state_is_tuple=True))
cell = tf.contrib.rnn.MultiRNNCell(cell,state_is_tuple=True)
output, _ = tf.nn.dynamic_rnn(cell=cell, inputs=features, dtype=tf.float32)

我没有这样的错误,但是预测确实很糟糕。

我定义hidden=128
features = tf.reshape(features, [-1, n_steps, n_input])具有单层情况下的(?,1,14)形状。

我的数据看起来像这个x.shape=(594,14), y.shape=(591,1)
我很困惑如何在 tensorflow 中堆叠LSTM细胞。我的tensorflow版本是0.14。

最佳答案

这是一个非常有趣的问题。最初,我认为两个代码会产生相同的输出(即,堆叠两个 LSTM单元)。

代码1

cell = tf.contrib.rnn.LSTMCell(hidden, state_is_tuple=True)
cell = tf.contrib.rnn.MultiRNNCell([cell] * num_layers,state_is_tuple=True)
print(cell)

代码2
cell = []
for i in range(num_layers):
    cell.append(tf.contrib.rnn.LSTMCell(hidden, state_is_tuple=True))
cell = tf.contrib.rnn.MultiRNNCell(cell,state_is_tuple=True)
print(cell)

但是,如果在两种情况下都打印单元格会产生类似以下内容,

代码1
[<tensorflow.python.ops.rnn_cell_impl.BasicLSTMCell object at 0x000000000D7084E0>, <tensorflow.python.ops.rnn_cell_impl.BasicLSTMCell object at 0x000000000D7084E0>]

代码2
[<tensorflow.python.ops.rnn_cell_impl.BasicLSTMCell object at 0x000000000D7084E0>, <tensorflow.python.ops.rnn_cell_impl.BasicLSTMCell object at 0x000000000D708B00>]

如果您仔细观察结果,
  • 对于代码1 ,打印两个 LSTM单元对象和一个对象的列表
    是其他副本的副本(因为两个对象的指针相同)
  • 对于代码2,打印两个不同的 LSTM单元对象的列表(因为两个对象的指针不同)。

  • 堆叠两个 LSTM单元如下所示,

    tensorflow - 无法使用MultiRNNCell和dynamic_rnn堆叠LSTM-LMLPHP

    因此,如果您考虑全局(实际的Tensorflow操作可能有所不同),它的作用是,
  • 第一个映射输入到 LSTM单元格1 隐藏单元(在您的情况下, 14 128 )。
  • 其次,将 LSTM单元格1 的隐藏单元映射到 LSTM单元格2 的隐藏单元(在您的情况下,将 128 映射到 128 )。

  • 因此,当您尝试对 LSTM单元格的相同副本执行上述两个操作时(由于权重矩阵的尺寸不同),会出现错误。

    但是,如果您将隐藏单位的数量与输入单位的数量相同(在您的情况下,输入为 14 而隐藏的是 14 ),则没有错误(因为权重矩阵的尺寸相同) ),尽管您使用的是 LSTM单元格

    因此,如果您想堆叠两个 LSTM单元,那么我认为您的第二种方法是正确的。

    关于tensorflow - 无法使用MultiRNNCell和dynamic_rnn堆叠LSTM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47371608/

    10-13 09:00