7

我正在训练一个 LSTM 模型,使用以下 3 个不同特征的 50 步序列作为输入:

#x_train
[[[a0,b0,c0],.....[a49,b49,c49]],
  [a1,b1,c1]......[a50,b50,c50]],
  ...
  [a49,b49,c49]...[a99,b99,c99]]]

使用以下因变量

#y_train
[a50, a51, a52, ... a99]

下面的代码仅用于预测 a,我如何让它在给定的时间步长预测并返回 [a,b,c] 的向量?

def build_model():
model = Sequential()

model.add(LSTM(
    input_shape=(50,3),
    return_sequences=True, units=50))
model.add(Dropout(0.2))

model.add(LSTM(
    250,
    return_sequences=False))
model.add(Dropout(0.2))

model.add(Dense(1))
model.add(Activation("linear"))

model.compile(loss="mse", optimizer="rmsprop")
return model
4

1 回答 1

13

每层的输出取决于它有多少个单元/单元/过滤器。

您的输出有 1 个特征,因为Dense(1...)只有一个单元格。

只要把它变成一个Dense(3...)就可以解决你的问题。


现在,如果您希望输出具有与输入相同的时间步数,那么您需要return_sequences = True在所有 LSTM 层中打开。

LSTM 的输出是:

  • (批量大小,单位) - 与return_sequences=False
  • (批量大小、时间步长、单位) - 与return_sequences=True

然后,您在后续图层中使用TimeDistributed图层包装器来工作,就好像它们也有时间步长一样(它基本上会保留中间的维度)。

def build_model():
    model = Sequential()

    model.add(LSTM(
        input_shape=(50,3),
        return_sequences=True, units=50))
    model.add(Dropout(0.2))

    model.add(LSTM(
        250,
        return_sequences=True))
    model.add(Dropout(0.2))

    model.add(TimeDistributed(Dense(3)))
    model.add(Activation("linear"))

    model.compile(loss="mse", optimizer="rmsprop")
    return model
于 2017-09-07T19:13:52.303 回答