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

时间:2019-06-13 07:50:46

标签: keras lstm 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))
  • Q1:优良作法是不要在之后直接使用BatchNormalization LSTM层?
  • Q2:在LSTM中使用Dropout是一种好习惯吗 层?
  • Q3:是使用BatchNormalization和Dropout之间的 密密麻麻的好习惯吗?
  • Q4:如果我堆叠多个LSTM层,在它们之间使用BatchNormalization是一个好主意吗?

第2种情况:具有时间分布层的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)))
  • Q5:BatchNormalozationDropout应该在TimeDistributed层之间使用时,应该包裹在TimeDistributed(Dense())层中吗?还是保留它们不带走是否正确?
  • Q6:是否可以在编码器-解码器LSTM块之后,之前或之间应用批量归一化?
  • Q7:如果将ConvLSTM2D层用作第一层(编码器),这会在Dropout和BatchNormalization的使用方面有所不同吗?

  • Q8:是否应在LSTM块内使用recurrent_dropout自变量?如果是,应将其与示例中的普通dropout参数结合使用,还是应该交换? 提前非常感谢您!

0 个答案:

没有答案