我写过一个小型神经网络,用于分类汽车和非汽车图像。我需要帮助以避免过度拟合。该模型如下所示:
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%。你能提出一些建议吗?
答案 0 :(得分:2)
我建议尝试减小图层的大小,因为这可能是过度拟合的原因(有太多参数需要训练)。
例如,此图层model.add(Dense(256))
可能太大。你可以尝试用50-70范围内的东西替换256,看看它是如何工作的,并从那里继续。您也可以尝试减小卷积层的大小\。
答案 1 :(得分:1)
所以我至少可以看到两种技术:
dropout
。valid
套training
套中某些汽车模式的代表性不足。您可以尝试增加train - valid
拆分的值,并检查损失值是否彼此更接近。 答案 2 :(得分:0)
我会发表评论,但我对该网站的评论太新了。我同意Miriam的说法,过度拟合只是说“过多地相信训练数据”。神经网络中发生的事情本质上是一个输出分类的函数(因为你正在进行分类与回归)。这意味着你有一条线,一条线下的所有东西都是一个类,上面的一切都是另一条。通过增加节点/层和总层数,您可以使用神经网络来表示更复杂的功能。因此,通过添加更多图层/节点,您将始终在训练集上获得更好的分数,但不一定在其他数据上。想象一下一行中的一堆点,但它们不是直接在线上。并且有一些异常值。或许代表它的正确功能将是一条直线,但是一个巨大的神经网络可能完全符合一些疯狂的复杂功能。当添加新点时,该线将提供更好的分类,因为神经网络正在尝试如此紧密地拟合您的训练数据。如果你过度拟合,我会说首先要看的是神经网络的复杂性。