【问题标题】:TimeDistributed layer and return sequences etc for LSTM in KerasKeras中LSTM的时间分布层和返回序列等
【发布时间】:2017-10-14 18:15:01
【问题描述】:

对不起,我是 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 应该稳定神经网络。但是我使用RMSprop 从来没有得到好的结果。
  5. 如何选择好的lrSGD的动量?我一直在手动测试不同的组合。 keras中有交叉验证方法吗?

【问题讨论】:

  • 你为什么写[140*50*19]而不是[140, 50, 19]?形状真的是[133000]吗?
  • 谢谢,我的意思是 [140, 50, 19]

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


【解决方案1】:

所以:

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

【讨论】:

  • 亲爱的,如果您设置 return_sequences = True,那么输出的形状将是 [140,50,1]。在这种情况下,我可以在输出时考虑多少个神经元?每个时间步只有 1 个神经元、50 个神经元或 1 个神经元,总计 50?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 2018-10-28
  • 2018-12-28
  • 2018-01-11
  • 1970-01-01
相关资源
最近更新 更多