Keras CNN:验证准确性停留在70%,培训准确性达到100%

时间:2019-01-15 21:26:06

标签: python tensorflow keras neural-network conv-neural-network

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

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_epoch的{​​{1}}和validation_steps值相乘以补偿小的数据集。批量大小为32。

fit_generator

现在,我的问题是我的验证准确性通常停留在〜70%左右,而验证损失却开始迅速增加。同时,训练损失接近于0,而训练精度几乎达到100%。 到目前为止,我已经尝试通过以下方式对此进行反击:

  • 将批次大小更改为2的其他幂;
  • 改变亚当的学习率;
  • 尝试另一个优化器;
  • 雇用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]) ReduceLROnPlateau
  • 将Dropout参数的值更改为0.2-0.95之间的任何值;
  • 使用Dropouts代替BatchNormalization;
  • 更改图像的大小。

当然还有这些的各种组合。我还更改了整个数据集(在不一致之前,图像在类内部差异很大,并且类具有不同的大小)。似乎没有任何工作。有什么想法我可能做错了吗?

1 个答案:

答案 0 :(得分:0)

这些结果告诉您,您过拟合了:您的模型在训练准确性上获得了满分,这意味着该模型可能只是记住了所看到的内容,而没有适当地泛化(因此陷入了70%的验证准确性)。

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

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

您可以尝试的另一种方法是转移学习。获得更大的图像集;不管是门窗还是其他东西都没关系。训练您的网络以执行该任务。然后,一旦完成,扔掉最后一层,为您的特定3个班级替换一个新的层,然后再次训练,但只是权重。 (更多的信息和细节可以在文献中找到。)