CNN的验证准确性没有增加

时间:2019-09-26 14:59:59

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

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

我已经训练了许多网络,更改了超参数,但是每次我的训练精度达到98%以上且验证精度保持在60-70%左右时。我尝试了包含3-5个转换层和1个FC层的网络。我使用L2正则化,批处理规范,数据增强和数据删除来消除过度拟合。然后,我尝试在培训进行过程中降低Adam优化器的学习率。我对网络进行了100多个时期的培训,有时甚至达到200个时期。但是,我可以达到的最佳验证准确性(数据集的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)
])

1 个答案:

答案 0 :(得分:1)

  • 确保使用所有可用的数据增强形式(缩放,旋转,平移,翻转等)。
  • 在所有层上使用内核正则化器。
  • 在所有转化层之后添加SpatialDropout2D
  • 在所有“转化”和“密集”层之后添加BatchNormalization(显然,最后一个密集/ Sigmoid层除外)。
  • 减小网络规模(减少层数和/或减少每层过滤器/单元的数量);您需要尽可能小的网络,仍然可以学习训练数据。

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


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

  • 优先选择3x3内核转换层的序列,而不是5x5或更大内核的单个转换层。
  • 用GlobalAveragePooling层替换Flatten层,并可能除去除最后一层以外的所有Dense层。
  • 使用stride = 2 MaxPooling,不要同时使用两者。
相关问题