【问题标题】:Cannot stack LSTM with MultiRNNCell and dynamic_rnn无法使用 MultiRNNCell 和 dynamic_rnn 堆叠 LSTM
【发布时间】:2017-11-18 22:13:04
【问题描述】:

我正在尝试构建一个多元时间序列预测模型。我按照以下教程进行温度预测。 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'(操作: '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。

【问题讨论】:

    标签: tensorflow lstm multi-layer


    【解决方案1】:

    这是一个非常有趣的问题。最初,我认为两个代码会产生相同的输出(堆叠两个 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 单元对象 和一个对象的列表 是 other 的副本(因为两个对象的指针相同)
    • 对于 code 2 打印两个不同的 LSTM 单元对象 的列表(因为两个对象的指针不同)。

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

    因此,如果你从大局考虑(实际的 TensorFlow 操作可能会有所不同),它的作用是,

    1. 首先将 输入 映射到 LSTM 单元 1 隐藏单元(在您的情况下为 14128)。
    2. 其次,将 LSTM 单元 1 的隐藏单元映射到 LSTM 单元 2 的隐藏单元(在您的情况下为 128128 )。

    因此,当您尝试对 LSTM 单元 的同一副本执行上述两个操作时(因为权重矩阵的维度不同),就会出现错误。

    但是,如果您使用 hidden 单位的数量与 input 单位的数量相同(在您的情况下,输入是 14 并且隐藏是14)虽然您使用的是相同的 LSTM 单元,但没有错误(因为权重矩阵的维度相同)。

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

    【讨论】:

    • 感谢您的解释。我还是一头雾水:
    • 你对什么感到困惑?
    • 为什么第一张地图是 14(这是我的特征的维度)到 256(这是我的批量大小)。
    • 对不起,应该是 128(这是你隐藏的)而不是 256。
    • 我有一个时间序列数据:从 t = 1 到 594,每个数据点有 14 个特征。如果我想构建一个 3 层 LSTM 进行预测,我应该将我的数据设置为 have(None, 128, 14),LSTM 单元格是 (128) 吗?这样我的 LSTM 网络就有了长度(128)。我可以使用第一种方法来堆叠 LSTM。
    猜你喜欢
    • 2021-07-26
    • 2019-09-08
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 2021-01-09
    • 1970-01-01
    相关资源
    最近更新 更多