我在 Keras 中有一个卷积 + LSTM 模型,类似于这个(参考 1),我在 Kaggle 比赛中使用它。架构如下所示。我已经在我标记的 11000 个样本集(两个类别,初始流行度约为 9:1,所以我将 1 的样本上采样到大约 1/1 的比率)训练了 50 个 epoch,其中 20% 的验证拆分。我得到了明显的过度拟合有一段时间,但我认为它可以通过噪声和丢失层来控制。
模型看起来训练非常好,最终在整个训练集上得分 91%,但在测试数据集上进行测试,绝对垃圾。
注意:验证准确率高于训练准确率。这与“典型”过拟合相反。
我的直觉是,考虑到较小的验证拆分,该模型仍然设法过强地适应输入集并失去泛化能力。另一个线索是 val_acc 大于 acc,这看起来很可疑。这是最有可能的情况吗?
如果这是过度拟合,增加验证拆分会完全缓解这种情况,还是我会遇到同样的问题,因为平均而言,每个样本仍然会看到总时期的一半?
该模型:
Layer (type) Output Shape Param # Connected to
====================================================================================================
convolution1d_19 (Convolution1D) (None, None, 64) 8256 convolution1d_input_16[0][0]
____________________________________________________________________________________________________
maxpooling1d_18 (MaxPooling1D) (None, None, 64) 0 convolution1d_19[0][0]
____________________________________________________________________________________________________
batchnormalization_8 (BatchNormal(None, None, 64) 128 maxpooling1d_18[0][0]
____________________________________________________________________________________________________
gaussiannoise_5 (GaussianNoise) (None, None, 64) 0 batchnormalization_8[0][0]
____________________________________________________________________________________________________
lstm_16 (LSTM) (None, 64) 33024 gaussiannoise_5[0][0]
____________________________________________________________________________________________________
dropout_9 (Dropout) (None, 64) 0 lstm_16[0][0]
____________________________________________________________________________________________________
batchnormalization_9 (BatchNormal(None, 64) 128 dropout_9[0][0]
____________________________________________________________________________________________________
dense_23 (Dense) (None, 64) 4160 batchnormalization_9[0][0]
____________________________________________________________________________________________________
dropout_10 (Dropout) (None, 64) 0 dense_23[0][0]
____________________________________________________________________________________________________
dense_24 (Dense) (None, 2) 130 dropout_10[0][0]
====================================================================================================
Total params: 45826
这是拟合模型的调用(类权重通常约为 1:1,因为我对输入进行了上采样):
class_weight= {0:1./(1-ones_rate), 1:1./ones_rate} # automatically balance based on class occurence
m2.fit(X_train, y_train, nb_epoch=50, batch_size=64, shuffle=True, class_weight=class_weight, validation_split=0.2 )
SE 有一些愚蠢的规则,我可以发布不超过 2 个链接,直到我的分数更高,所以如果你有兴趣,这里有一个例子:参考 1:machinelearningmastery DOT com SLASH sequence-classification-lstm-recurrent-neural-networks- python-keras