我正在使用 LSTM 网络进行多变量多时间步长预测。所以基本上seq2seq
预测将一些n_inputs
输入到模型中以预测n_outputs
时间序列的数量。
我的问题是如何有意义地应用Dropout
,BatchnNormalization
因为这似乎是 Recurrent 和 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:不直接在 LSTM 层之后使用 BatchNormalization 是一种好习惯吗?
- 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:在层间使用时应该
BatchNormalozation
和Dropout
包裹在里面,还是不用它们是正确的?TimeDistributed
TimeDistributed(Dense())
- Q6:可以或应该在编码器-解码器 LSTM 块之后、之前或之间应用批标准化吗?
Q7:如果将一个
ConvLSTM2D
层用作第一层(编码器),这会对 Dropout 和 BatchNormalization 的使用产生影响吗?Q8:
recurrent_dropout
参数应该在 LSTM 块中使用吗?如果是,它应该与dropout
示例中的普通参数结合使用,还是应该交换?非常感谢您!