我有大约8200张图像用于人脸检测任务。其中4800个包含人脸。其他3400张图像包含3D人脸面具(由橡胶/乳胶制成)、人类卡通脸和猴子的脸。我想检测给定的图像是否包含真实的人脸。
我已经训练了许多网络,改变了超参数,但每次我的训练准确率都高达98%以上,验证准确率保持在60-70%左右。我已经尝试过包含3-5个Conv层和一个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)
])发布于 2019-09-26 23:24:49
SpatialDropout2D。BatchNormalization (除了最后一个密集/sigmoid层,减少网络的大小(较少的层和/或每层较少的过滤器/单元);您希望尽可能小的网络仍然可以学习训练数据。如果所有这些组合在一起还不足以获得良好的验证准确性,那么您可能就是没有足够的数据。
以下几个技巧可能不会减少过度拟合,但通常会有所帮助:
https://stackoverflow.com/questions/58119629
复制相似问题