【问题标题】:Validation Accuracy of CNN not increasingCNN的验证准确率没有增加
【发布时间】:2020-01-26 21:35:16
【问题描述】:

我有大约 8200 张图像用于人脸检测任务。其中 4800 个包含人脸。其他 3400 张图像包含 3D 人脸面具(由橡胶/乳胶制成)、卡通人脸、猴子脸的图像。我想检测给定的图像是否包含真实的人脸。

我已经训练了许多网络,改变了超参数,但每次我的训练准确率都高达 98% 以上,验证准确率保持在 60-70% 左右。我已经尝试过包含 3-5 个 Conv 层和一个 FC 层的网络。我使用 L2 正则化、批量规范、数据增强和 dropout 来消除过拟合。然后我尝试随着训练的进行降低 Adam 优化器的学习率。我对网络进行了超过 100 个 epoch 的训练,有时甚至高达 200 个 epoch。然而,我能达到的最佳验证准确率(数据集的 20%)是 71%。有没有办法将验证准确率提高到 85% 以上? 我使用以下架构,输入图像大小为 256*256*3,并以 16 的批量大小训练它们。

regularizer = tf.keras.regularizers.l2(l=0.005)
model = tf.keras.models.Sequential([

    tf.keras.layers.Conv2D(64, (5, 5),strides=(2, 2), activation='relu', input_shape=(256, 256, 3), kernel_regularizer=regularizer),
    tf.keras.layers.MaxPooling2D(2, 2),

    tf.keras.layers.Conv2D(96, (5, 5), padding='same', activation='relu', kernel_regularizer=None),
    tf.keras.layers.MaxPooling2D(2, 2),

    tf.keras.layers.Conv2D(128, (3, 3), padding='same', activation='relu', kernel_regularizer=None),
    tf.keras.layers.MaxPooling2D(2, 2),

    tf.keras.layers.Conv2D(256, (3, 3), padding='same', activation='relu', kernel_regularizer=None),
    tf.keras.layers.MaxPooling2D(2, 2),

    tf.keras.layers.Flatten(),

    #tf.keras.layers.Dense(2048, activation='relu', kernel_regularizer=regularizer),
    tf.keras.layers.Dense(4096, activation='relu', kernel_regularizer=None),
    tf.keras.layers.Dropout(0.4),
    tf.keras.layers.Dense(1, activation='sigmoid', kernel_regularizer=regularizer)
])

【问题讨论】:

  • 您可能只是没有足够大的数据集。 8200 张图像不是很多,如果你没有足够的图像来学习你的任务的一般表示,你就会过拟合。尝试在您的图像上使用转换来增加您的有效样本数量。
  • 我尝试了旋转、水平翻转和改变亮度等增强功能。这没有多大帮助。

标签: python tensorflow machine-learning keras deep-learning


【解决方案1】:
  • 确保您使用所有可用的数据增强形式(缩放、旋转、平移、翻转等)。
  • 在所有层上使用内核正则化器。
  • 在所有 Conv 层之后添加 SpatialDropout2D
  • 在所有 Conv 和 Dense 层之后添加 BatchNormalization(显然,最后一个 Dense/sigmoid 层除外)。
  • 减小网络规模(减少层数和/或每层过滤器/单元数);您需要尽可能小的网络来学习训练数据。

如果所有这些都不足以获得良好的验证准确性,那么您可能只是没有足够的数据。


一些可能不会减少过拟合但总体上会有所帮助的技巧:

  • 首选 3x3 内核卷积层序列,而不是具有 5x5 或更大内核的单个卷积层。
  • 将 Flatten 层替换为 GlobalAveragePooling 层,并可能移除除最后一层之外的所有 Dense 层。
  • 使用 stride=2 MaxPooling,不能同时使用。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多