Python CNN的验证准确性没有增加
我有大约8200张用于人脸检测任务的图像。其中4800张是人脸。其他3400张图像包含3D人脸面具(由橡胶/乳胶制成)、卡通人脸、猴子脸的图像。我想检测给定的图像是否包含真实的人脸 我已经训练了许多网络,改变了超参数,但每次我的训练准确率都高达98%以上,验证准确率保持在60-70%左右。我已经尝试了包含3-5个Conv层和一个FC层的网络。我使用L2正则化、批处理范数、数据增强和退出来消除过拟合。然后,随着培训的进行,我尝试降低Adam optimizer的学习率。我对网络进行了100多个时代的培训,有时甚至多达200个时代。然而,我能达到的最佳验证准确率(数据集的20%)是71%。是否有办法将验证准确率提高到85%以上? 我使用了下面的体系结构,输入图像大小为256*256*3,并以16的批量大小对它们进行了训练Python CNN的验证准确性没有增加,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我有大约8200张用于人脸检测任务的图像。其中4800张是人脸。其他3400张图像包含3D人脸面具(由橡胶/乳胶制成)、卡通人脸、猴子脸的图像。我想检测给定的图像是否包含真实的人脸 我已经训练了许多网络,改变了超参数,但每次我的训练准确率都高达98%以上,验证准确率保持在60-70%左右。我已经尝试了包含3-5个Conv层和一个FC层的网络。我使用L2正则化、批处理范数、数据增强和退出来消除过拟合。然后,随着培训的进行,我尝试降低Adam optimizer的学习率。我对网络进行了100多个时代
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)
])
- 确保您正在使用所有可用的数据增强形式(缩放、旋转、平移、翻转等)
- 在所有层上使用内核正则化器
- 在所有Conv层之后添加
SpatialDropout2D
- 在所有Conv和密集层(显然,最后一个密集层/S形层除外)之后添加
BatchNormalization
- 减少网络的大小(减少层和/或减少每层的过滤器/单元);您需要尽可能小的网络来学习训练数据
以下几点提示可能不会减少过度装配,但通常会有所帮助:
- 更喜欢3x3内核conv层的序列,而不是5x5或更大内核的单个conv层
- 用GlobalAveragePooling层替换扁平层,并可能移除除最后一层之外的所有密集层
- 使用stride=2或MaxPooling,而不是两者都使用