如何在 LSTM 网络 (Keras) 中使用 Dropout 和 BatchNormalization

gus*_*avz 5 lstm keras recurrent-neural-network batch-normalization dropout

我正在使用 LSTM 网络进行多元多时间步预测。因此,基本上seq2seq预测是将多个数据n_inputs输入模型以预测n_outputs时间序列的多个数据。

我的问题是如何有意义地应用DropoutBatchnNormalization因为这似乎是循环网络和 LSTM 网络广泛讨论的主题。为了简单起见,我们坚持使用 Keras 作为框架。

案例 1:普通 LSTM

model = Sequential()
model.add(LSTM(n_blocks, activation=activation, input_shape=(n_inputs, n_features), dropout=dropout_rate))
model.add(Dense(int(n_blocks/2)))
model.add(BatchNormalization())
model.add(Activation(activation))
model.add(Dense(n_outputs))
Run Code Online (Sandbox Code Playgroud)
  • Q1:在 LSTM 层之后不直接使用 BatchNormalization 是一个好习惯吗?
  • Q2:在 LSTM 层内使用 Dropout 是一个好的做法吗?
  • Q3:在 Dense 层之间使用 BatchNormalization 和 Dropout 是一个好的实践吗?
  • Q4:如果我堆叠多个 LSTM 层,在它们之间使用 BatchNormalization 是一个好主意吗?

案例 2:带有 TimeDistributed Layers 的编码器解码器(如 LSTM)

model = Sequential()
model.add(LSTM(n_blocks, activation=activation, input_shape=(n_inputs,n_features), dropout=dropout_rate))
model.add(RepeatVector(n_outputs))
model.add(LSTM(n_blocks, activation=activation, return_sequences=True, dropout=dropout_rate))
model.add(TimeDistributed(Dense(int(n_blocks/2)), use_bias=False))
model.add(TimeDistributed(BatchNormalization()))
model.add(TimeDistributed(Activation(activation)))
model.add(TimeDistributed(Dropout(dropout_rate)))
model.add(TimeDistributed(Dense(1)))
Run Code Online (Sandbox Code Playgroud)
  • Q5:在层与层之间使用时,应该将BatchNormalozationDropout包裹在层内,还是不包裹它们是否正确?TimeDistributedTimeDistributed(Dense())
  • 问题 6:是否可以或应该在编码器-解码器 LSTM 块之后、之前或之间应用批归一化?
  • Q7:如果将一个ConvLSTM2D层用作第一层(编码器),这会对 Dropout 和 BatchNormalization 的使用产生影响吗?

  • Q8:该recurrent_dropout参数应该在 LSTM 块内使用吗?如果是,应该将其dropout与示例中的普通参数结合起来,还是应该交换?预先非常感谢您!