减少神经网络中的过拟合

Posted

技术标签:

【中文标题】减少神经网络中的过拟合【英文标题】:Reduce over-fitting in neural network 【发布时间】:2017-11-27 00:18:00 【问题描述】:

我编写了一个小型神经网络,用于对汽车和非汽车图像进行分类。我需要帮助来避免过度拟合。模型如下图:

model = Sequential()
model.add(Conv2D(8, 3, 3, input_shape=X.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(BatchNormalization())

model.add(Conv2D(16, 3, 3, input_shape=X.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(BatchNormalization())

model.add(Conv2D(32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(BatchNormalization())

model.add(Conv2D(64, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(BatchNormalization())
model.add(Dropout(0.5))

model.add(Flatten())  # this converts our 3D feature maps to 1D feature vectors
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

我正在使用生成器:

generator = ImageDataGenerator( featurewise_center=True,
                                samplewise_center=False,
                                featurewise_std_normalization=False,
                                samplewise_std_normalization=False,
                                zca_whitening=False,
                                rotation_range=20.,
                                width_shift_range=0.4,
                                height_shift_range=0.4,
                                shear_range=0.2,
                                zoom_range=0.2,
                                channel_shift_range=0.1,
                                fill_mode='nearest',
                                horizontal_flip=True,
                                vertical_flip=False,
                                rescale=1.2,
                                preprocessing_function=None)

最终,训练 acc 为 98%,而有效 acc 为 70%。你能提出一些建议吗?

【问题讨论】:

【参考方案1】:

所以我至少可以看到两种技术:

    尝试增加dropout。 您的过度拟合可能是由于您在training 集合中的valid 集合中的某些汽车模式的代表性不足。您可以尝试增加train - valid split 的值并检查损失值是否彼此更接近。

【讨论】:

发生了一些有趣的事情。有效 acc 在一些时期后增加,然后再次减少。此外,我收到了这个警告:Epoch comprised more than `samples_per_epoch` samples, which might affect learning results. Set `samples_per_epoch` correctly to avoid this warning. warnings.warn('Epoch comprised more than '你有什么建议吗?【参考方案2】:

我建议尝试减小层的大小,因为这可能是过度拟合的原因(需要训练的参数太多)。

例如,这层model.add(Dense(256)) 可能太大了。您可以尝试用 50-70 范围内的东西替换 256,看看它是如何工作的,然后从那里继续。您也可以尝试减少卷积层的大小\数量。

【讨论】:

【参考方案3】:

我会发表评论,但我对网站太陌生,无法发表评论。我同意 Miriam 的观点,过度拟合只是说“过于相信训练数据”。神经网络中发生的事情本质上是一个输出分类的函数(因为您正在进行分类与回归)。这意味着您有一条线,一条线下的所有内容都属于一个类,而上面的所有内容都是另一个。通过增加节点/层和总层数,您可以让您的神经网络表示更复杂的功能。因此,通过添加更多层/节点,您将始终在训练集上获得更好的分数,但不一定在其他数据上。想象一条线中有一堆点,但它们并不直接在线上。并且有一些异常值。也许代表它的正确函数是一条直线,但是一个巨大的神经网络可能会用一些疯狂的复杂函数完美地拟合这些点。添加新点时,这条线会给出更好的分类,因为神经网络正在尝试如此紧密地拟合您的训练数据。如果您过度拟合,我会说首先要看的是您的神经网络的复杂性。

【讨论】:

但是增加 dropout 实际上是随机减少神经元的数量。 我真的希望我能提供帮助。我的回答是基于我对 NN 的了解有限,这就像机器学习课程以及我对过度拟合的了解以及导致它的原因以及如何防止它。随着 NN 复杂性的增加,它会越多地尝试精确拟合您的数据,并且越有可能过度拟合。

以上是关于减少神经网络中的过拟合的主要内容,如果未能解决你的问题,请参考以下文章

神经网络中的过拟合

机器学习中的过拟合减少

如何降低神经网络模型的过拟合和欠拟合?

TensorFlow之tf.nn.dropout():防止模型训练过程中的过拟合问题

如何诊断长短期记忆网络模型的过拟合和欠拟合?

深度学习Trick——用权重约束减轻深层网络过拟合|附(Keras)实现代码