Keras 中 LSTM 的 TimeDistributed 层和 return 序列等

TimeDistributed layer and return sequences etc for LSTM in Keras

抱歉,我是 RNN 的新手。我在 TimeDistributed 层上阅读了

我已将我的数据重塑为 Keras 要求 [samples, time_steps, features][140*50*19],这意味着我有 140 个数据点,每个点有 50 个时间步长和 19 个特征。我的输出形状为 [140*50*1]。我更关心最后一个数据点的准确性。这是一个回归问题。

我当前的代码是:

x = Input((None, X_train.shape[-1]) , name='input')
lstm_kwargs = { 'dropout_W': 0.25, 'return_sequences': True, 'consume_less': 'gpu'} 
lstm1 = LSTM(64, name='lstm1', **lstm_kwargs)(x)
output = Dense(1, activation='relu', name='output')(lstm1)
model = Model(input=x, output=output)
sgd = SGD(lr=0.00006, momentum=0.8, decay=0, nesterov=False)
optimizer = sgd
model.compile(optimizer=optimizer, loss='mean_squared_error')

我的问题是:

  1. 我的case是多对多的,需要用return_sequences=True?如果我只需要最后一个时间步的预测,那将是多对一的。所以我需要我的输出是 [140*1*1]return_sequences=False
  2. 如果我使用多对多,有没有办法提高我最后一次时间点的准确性?我更关心它而不是其他点的准确性。
  3. 我尝试使用 TimeDistributed 层作为

    output = TimeDistributed(Dense(1, activation='relu'), name='output')(lstm1)
    

    性能似乎比不使用 TimeDistributed 层更差。为什么会这样?

  4. 我尝试使用 optimizer=RMSprop(lr=0.001)。我认为 RMSprop 应该可以稳定 NN。但是我从来没有能够使用 RMSprop.
  5. 获得好的结果
  6. 如何选择好的lrSGD的势头?我一直在手动测试不同的组合。 keras中有交叉验证方法吗?

所以:

  1. 是 - return_sequences=False 使您的网络仅输出序列预测的最后一个元素。
  2. 您可以使用 Lambda layer. 定义输出切片,您可以找到有关如何执行此操作的示例。将输出切片后,您可以提供额外的输出,您将在其中提供最后一个时间步长的值。
  3. 从计算的角度来看,这两种方法是等效的。也许问题在于权重采样引入的随机性。
  4. 实际上 - 使用 RMSProp 作为 RNN 的首选是经验法则 - 而不是普遍证明的规律。此外 - 强烈建议不要更改它的参数。所以这可能会导致问题。另一件事是LSTM需要大量的时间来稳定。也许你需要把它留到更多的时代。最后一件事 - 也许您的数据可能有利于另一个激活功能。
  5. 你可以使用 keras.sklearnWrapper.