我正在尝试建立一个多变量时间序列预测模型。我按照以下教程进行温度预测。 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)
但我有一个错误说:
ValueError:尺寸必须相等,但为256和142 'rnn / while / rnn / multi_rnn_cell / cell_0 / cell_0 / lstm_cell / MatMul_1'(op: 'MatMul')输入形状:[?,256],[142,512]。
当我尝试这个时:
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单元格。我的张量流版本是0.14。
答案 0 :(得分:10)
这是一个非常有趣的问题。最初,我认为两个代码产生相同的输出(即堆叠两个 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细胞,我认为您的第二种方法是正确的。