Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python CNN的验证准确性没有增加_Python_Tensorflow_Machine Learning_Keras_Deep Learning - Fatal编程技术网

Python CNN的验证准确性没有增加

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多个时代

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

我已经训练了许多网络,改变了超参数,但每次我的训练准确率都高达98%以上,验证准确率保持在60-70%左右。我已经尝试了包含3-5个Conv层和一个FC层的网络。我使用L2正则化、批处理范数、数据增强和退出来消除过拟合。然后,随着培训的进行,我尝试降低Adam optimizer的学习率。我对网络进行了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)
])
  • 确保您正在使用所有可用的数据增强形式(缩放、旋转、平移、翻转等)
  • 在所有层上使用内核正则化器
  • 在所有Conv层之后添加
    SpatialDropout2D
  • 在所有Conv和密集层(显然,最后一个密集层/S形层除外)之后添加
    BatchNormalization
  • 减少网络的大小(减少层和/或减少每层的过滤器/单元);您需要尽可能小的网络来学习训练数据
如果所有这些组合都不足以获得良好的验证准确性,那么您可能就是没有足够的数据


以下几点提示可能不会减少过度装配,但通常会有所帮助:

  • 更喜欢3x3内核conv层的序列,而不是5x5或更大内核的单个conv层
  • 用GlobalAveragePooling层替换扁平层,并可能移除除最后一层之外的所有密集层
  • 使用stride=2或MaxPooling,而不是两者都使用

您可能没有足够大的数据集。8200张图片不是一吨重,如果你没有足够的图片来学习任务的一般表示,你将有过度拟合。试着在你的图像上使用变换来增加你的有效样本数。我试过像旋转、水平翻转和改变亮度这样的增强。这没什么帮助。辍学和空间辍学有什么区别吗?@saankyamondal-See。本质上,它删除了整个“过滤器”,而不是单个元素。