过度拟合数据集的可能原因

Posted

技术标签:

【中文标题】过度拟合数据集的可能原因【英文标题】:Possible reasons for overfitting the dataset 【发布时间】:2017-08-21 23:15:48 【问题描述】:

我使用的数据集包含 33k 张图像。训练包含 27k 个图像,验证集包含 6k 个图像。 我为模型使用了以下 CNN 代码:

model = Sequential()

model.add(Convolution2D(32, 3, 3, activation='relu', border_mode="same", input_shape=(row, col, ch)))
model.add(Convolution2D(32, 3, 3, activation='relu', border_mode="same"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Convolution2D(64, 3, 3, activation='relu', border_mode="same"))
model.add(Convolution2D(128, 3, 3, activation='relu', border_mode="same"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Activation('relu'))
model.add(Dense(1024))
model.add(Dropout(0.5))
model.add(Activation('relu'))
model.add(Dense(1))
adam = Adam(lr=0.0001)
model.compile(optimizer=adam, loss="mse", metrics=["mae"])

我获得的输出有一个decreasing training loss,但increasing validation loss 建议overfitting。但是我已经包含了dropouts,它应该对preventing overfitting 有所帮助。以下是训练 10 个 epoch 时的输出快照:

Epoch 1/10
27008/27040 [============================>.] - ETA: 5s - loss: 0.0629 - mean_absolute_error: 0.1428 Epoch 00000: val_loss improved from inf to 0.07595, saving model to dataset/-00-val_loss_with_mymodel-0.08.hdf5
27040/27040 [==============================] - 4666s - loss: 0.0629 - mean_absolute_error: 0.1428 - val_loss: 0.0759 - val_mean_absolute_error: 0.1925
Epoch 2/10
27008/27040 [============================>.] - ETA: 5s - loss: 0.0495 - mean_absolute_error: 0.1287 Epoch 00001: val_loss did not improve
27040/27040 [==============================] - 4605s - loss: 0.0494 - mean_absolute_error: 0.1287 - val_loss: 0.0946 - val_mean_absolute_error: 0.2289
Epoch 3/10
27008/27040 [============================>.] - ETA: 5s - loss: 0.0382 - mean_absolute_error: 0.1119 Epoch 00002: val_loss did not improve
27040/27040 [==============================] - 4610s - loss: 0.0382 - mean_absolute_error: 0.1119 - val_loss: 0.1081 - val_mean_absolute_error: 0.2463

So, what is wrong? Are there any other methods to prevent overfitting?Does shuffling of data help?

【问题讨论】:

您可以尝试提高dropout 费率。并在dropouts 之后添加BatchNormalization @MarcinMożejko,我按照link 中的建议在激活之前添加了 BatchNormalization。 val_loss 增加了,之前没有插入是 0.06,插入后我得到 val_loss 为 0.09。 【参考方案1】:

我会尝试添加1E-4 的重量衰减。这可以通过像这样添加权重衰减层来完成:model.add(Convolution2D(32, 3, 3, activation='relu', border_mode="same", input_shape=(row, col, ch), W_regularizer=l2(1E-4), b_regularizer=l2(1E-4)))。 L2 可以在keras.regularizers (https://keras.io/regularizers/#example) 中找到。权重正则化非常适合对抗过拟合。

不过,过度拟合可能不仅是您的模型的结果,也可能是您的模型的结果。如果验证数据比您的训练数据“更难”,那么可能只是您无法适应它。

【讨论】:

我有 33K 图像作为数据集,我将它们打乱并分布在 80% 的训练和 20% 的验证集中。 regularizer 是添加到每一层还是仅在编译模型时添加,即model.compile() 为每一层添加。

以上是关于过度拟合数据集的可能原因的主要内容,如果未能解决你的问题,请参考以下文章

过拟合问题?出现原因?怎么解决?

机器学习:过拟合与正则化

机器学习--过度拟合

在机器学习中过度拟合术语

是否有可能在几个时代内过度填充250,000个例子?

可能过度拟合的分类树,但具有稳定的预测误差