我大约有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)
])
答案 0 :(得分:1)
SpatialDropout2D
。BatchNormalization
(显然,最后一个密集/ Sigmoid层除外)。如果所有这些加在一起还不足以获得良好的验证准确性,那么您可能只是没有足够的数据。
一些技巧可能不会减少过度拟合,但总体上会有所帮助: