Точность валидации CNN не увеличивается - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть около 8200 изображений для задачи обнаружения лица.4800 из них содержат человеческие лица.Другие 3400 изображений содержат изображения 3D-масок человеческих лиц (которые сделаны из резины / латекса), человеческие мультяшные лица, лица обезьян.Я хочу определить, содержит ли данное изображение настоящее человеческое лицо или нет.

Я обучил множество сетей, меняя гиперпараметры, но каждый раз, когда моя точность тренировки достигает 98%, а точность проверки остается на уровне около 60-70%.Я опробовал сети, содержащие 3-5 слоев Conv и один слой FC.Я использовал регуляризацию L2, пакетную норму, увеличение данных и выпадение для устранения переоснащения.Затем я попытался уменьшить скорость обучения оптимизатора Адама в процессе обучения.Я обучал сеть более 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 Ответ

1 голос
/ 26 сентября 2019
  • Убедитесь, что вы используете все доступные формы увеличения данных (масштабирование, вращение, перевод, перевороты и т. Д.).
  • Используйте регуляризаторы ядра на всех слоях.
  • ДобавитьSpatialDropout2D после всех слоев Conv.
  • Добавьте BatchNormalization после всех слоев Conv и Dense (кроме последнего, очевидно, плотного / сигмовидного).
  • Уменьшите размер вашей сети (меньше слоев и / или меньше фильтров / единиц на слой);вам нужна наименьшая возможная сеть, в которой можно учить данные обучения.

Если всех этих данных недостаточно, чтобы получить хорошую точность проверки, возможно, у вас просто недостаточно данных.


Несколько советов, которые, вероятно, не уменьшат переоснащение, но имеют тенденцию быть полезными в целом:

  • Предпочитают последовательности слоев конвекций ядра 3x3, а не одиночные слои конвекций с 5x5 илиядра большего размера.
  • Замените слой Flatten слоем GlobalAveragePooling и, возможно, удалите все плотные слои, кроме последнего.
  • Используйте либо stride = 2 , либо MaxPooling, но необа.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...