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

我正在尝试使用带有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;
更改图像的大小。

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

参考方案

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

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

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

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

Keras Tensorboard用于DQN强化学习 - python

我正在使用keras构建DQN,并使用具有经验重播记忆的经典DQN算法对其进行训练。由于在dqn中需要多次调用model.fit,这意味着每次从重播内存中采样批数据时,使用keras的model.fit( .... callbacks=TensorBoard(...))时,每次拟合都会生成新的事件日志文件。它会产生两个问题,首先,它会生成过于笨拙的事件日志文…

如何在模型内部冻结模型的特定层? - python

我的keras模型由多个模型组成。每个“子模型”都有多个层次。如何在“子模型”中调出图层并设置可训练性/冻结特定图层? python参考方案 我将使用Keras中的VGG19卷积神经网络的示例,尽管它适用于任何神经网络体系结构:from keras.applications.vgg19 import VGG19 model = VGG19(weights=&…

在返回'Response'(Python)中传递多个参数 - python

我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

Python exchangelib在子文件夹中读取邮件 - python

我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…

R'relaimpo'软件包的Python端口 - python

我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。