Keras CNN:验证准确率达到70%,培训准确率达到100%

问题描述 投票:1回答:1

我正在尝试使用带有Keras的Python创建一个神经网络,目的是识别照片和视频上的门窗。这是我的架构:

img_width = 32
img_height = 32

model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same', activation='relu', input_shape=(img_width, img_height, 3)))
model.add(BatchNormalization())
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, (3, 3), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(3, activation='softmax'))

我正在使用带有默认参数和分类交叉熵损失函数的Adam优化器。我有3类输入数据,每组685张图片,我正在使用ImageDataGenerator。我还将steps_per_epochvalidation_stepsfit_generator值乘以补偿小数据集。批量大小为32。

train_data_generator = ImageDataGenerator(
    rescale=1. / 255,
    width_shift_range=0.2,
    height_shift_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    validation_split=0.2)

train_generator = train_data_generator.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='categorical',
    subset='training')

validation_generator = train_data_generator.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='categorical',
    subset='validation')

early_stopping = EarlyStopping(monitor='val_loss',
                           min_delta=1e-3,
                           patience=10,
                           verbose=1,
                           mode='auto',
                           restore_best_weights=True)

history = model.fit_generator(
    train_generator,
    steps_per_epoch=8*nb_train_samples // batch_size,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=8*nb_validation_samples // batch_size,
    callbacks=[tensor_board, model_checkpoint, early_stopping])

现在,我的问题是我的验证准确性通常会停留在~70%,而验证损失开始迅速增加。与此同时,训练损失接近0,而训练精度几乎达到100%。到目前为止,我试图通过以下方式来应对:

  • 将批量大小更改为2的其他幂;
  • 改变亚当的学习率;
  • 尝试另一个优化器;
  • 雇用ReduceLROnPlateauLearningRateScheduler;
  • 将Dropout参数的值更改为0.2-0.95范围内的任何值;
  • 使用Dropouts而不是BatchNormalization;
  • 改变图像的大小。

当然还有各种组合。我也改变了整个数据集(在它不一致之前,图像内部的图像差异很大,而且类的大小也不同)。似乎没什么用。我有什么想法可能做错了吗?

python tensorflow keras neural-network conv-neural-network
1个回答
0
投票

这些结果告诉您,你的过度拟合:你的模型在训练准确度上达到了完美的分数,这意味着模型可能只是记住它看到的东西,没有适当的推广(因此卡住了70%的验证准确度)。

由于你只有几百张图像,所以你可以做的并不多。至少你应该使用数据扩充。例如,如果拍摄图像并在垂直轴上翻转图像,则会得到一个新图像。您也可以放大不同的级别,或稍微旋转(不要太多)。

BatchNormalization不是正则化技术,因此“Dropout而不是BatchNorm”有点奇怪。

你可以尝试的另一件事是转学。获得更大的图像集;无论是门窗还是其他东西都没关系。训练您的网络执行该任务。然后,一旦完成,扔掉最后一层,用一个新的替换为你的特定3个类,然后再次训练,但只是那层的权重。 (更多信息和细微之处可以在文献中找到)。

© www.soinside.com 2019 - 2024. All rights reserved.