无法将 LSTM 与 MultiRNNCell 和 dynamic_rnn 叠加
Cannot stack LSTM with MultiRNNCell and dynamic_rnn
我正在尝试构建多变量时间序列预测模型。我按照以下教程进行温度预测。 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: Dimensions must be equal, but are 256 and 142 for
'rnn/while/rnn/multi_rnn_cell/cell_0/cell_0/lstm_cell/MatMul_1' (op:
'MatMul') with input shapes: [?,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 单元。我的tensorflow版本是0.14。
这是一个很有趣的问题。最初,我认为两个代码产生相同的输出(i.e 堆叠两个 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)
但是,如果您在这两种情况下都打印 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 单元对象 和一个对象的列表
是 other 的副本(因为两个对象的指针相同)
- For code 2 打印两个不同的 LSTM 单元对象的列表(因为两个对象的指针不同)。
堆叠两个 LSTM 单元 如下所示,
因此,如果你考虑大局(实际的Tensorflow操作可能不同),它所做的是,
- 首先将 inputs 映射到 LSTM 单元 1 隐藏单元(在你的情况下 14 到128).
- 其次,将 LSTM 单元 1 的隐藏单元映射到 LSTM 单元 2 的隐藏单元(在你的情况下 128 到 128) .
因此,当你试图对同一份LSTM单元进行上述两种操作时(由于权重矩阵的维度不同),会出现错误。
但是,如果您使用 hidden 单位的数量与 input 单位的数量相同(在您的情况下,输入是 14 而隐藏的是 14) 尽管你使用的是相同的 LSTM,但没有错误(因为权重矩阵的维度相同)细胞.
因此,如果您正在考虑堆叠两个 LSTM 单元,我认为您的第二种方法是正确的。
我正在尝试构建多变量时间序列预测模型。我按照以下教程进行温度预测。 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: Dimensions must be equal, but are 256 and 142 for 'rnn/while/rnn/multi_rnn_cell/cell_0/cell_0/lstm_cell/MatMul_1' (op: 'MatMul') with input shapes: [?,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 单元。我的tensorflow版本是0.14。
这是一个很有趣的问题。最初,我认为两个代码产生相同的输出(i.e 堆叠两个 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)
但是,如果您在这两种情况下都打印 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 单元对象 和一个对象的列表 是 other 的副本(因为两个对象的指针相同)
- For code 2 打印两个不同的 LSTM 单元对象的列表(因为两个对象的指针不同)。
堆叠两个 LSTM 单元 如下所示,
因此,如果你考虑大局(实际的Tensorflow操作可能不同),它所做的是,
- 首先将 inputs 映射到 LSTM 单元 1 隐藏单元(在你的情况下 14 到128).
- 其次,将 LSTM 单元 1 的隐藏单元映射到 LSTM 单元 2 的隐藏单元(在你的情况下 128 到 128) .
因此,当你试图对同一份LSTM单元进行上述两种操作时(由于权重矩阵的维度不同),会出现错误。
但是,如果您使用 hidden 单位的数量与 input 单位的数量相同(在您的情况下,输入是 14 而隐藏的是 14) 尽管你使用的是相同的 LSTM,但没有错误(因为权重矩阵的维度相同)细胞.
因此,如果您正在考虑堆叠两个 LSTM 单元,我认为您的第二种方法是正确的。