Keras中LSTM的TimeDistributed图层和返回序列等

时间:2017-05-15 20:31:58

标签: python neural-network keras lstm keras-layer

对不起,我是RNN的新手。我在TimeDistributed层上阅读了this post

我已将我的数据重新整理为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. 我的情况是多对多的,所以我需要使用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. 如何为lr选择好的SGD和动力?我一直在手动测试不同的组合。在keras中有交叉验证方法吗?

1 个答案:

答案 0 :(得分:2)

所以:

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