减少神经网络中的过度拟合

时间:2017-06-23 12:06:20

标签: python-3.x classification keras conv-neural-network

我写过一个小型神经网络,用于分类汽车和非汽车图像。我需要帮助以避免过度拟合。该模型如下所示:

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%。你能提出一些建议吗?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

  1. 尝试增加dropout
  2. 您的过度装扮可能来自validtraining套中某些汽车模式的代表性不足。您可以尝试增加train - valid拆分的值,并检查损失值是否彼此更接近。

答案 2 :(得分:0)

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