我正在尝试建立一个多元时间序列预测模型。我按照以下教程进行温度预测。 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>]
如果您仔细观察结果,
是其他副本的副本(因为两个对象的指针相同)
堆叠两个 LSTM单元如下所示,
因此,如果您考虑全局(实际的Tensorflow操作可能有所不同),它的作用是,
因此,当您尝试对 LSTM单元格的相同副本执行上述两个操作时(由于权重矩阵的尺寸不同),会出现错误。
但是,如果您将隐藏单位的数量与输入单位的数量相同(在您的情况下,输入为 14 而隐藏的是 14 ),则没有错误(因为权重矩阵的尺寸相同) ),尽管您使用的是 LSTM单元格。
因此,如果您想堆叠两个 LSTM单元,那么我认为您的第二种方法是正确的。
关于tensorflow - 无法使用MultiRNNCell和dynamic_rnn堆叠LSTM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47371608/