Разработка бинарного классификатора на основе CNN

Я разработал CNN для классификации изображений с целью автоматического контроля качества. Входные изображения имеют размер 320 x 320 пикселей. У меня есть 5 конверсионных слоев, слой FC с 512 выходами и последний слой только с двумя выходами: «хороший» или «плохой». Контроль качества должен осуществляться с точностью до 1,0. Я использую тензорный поток.

Я новичок в CNN, и у меня проблема с оценкой моей модели. Хотя я получаю точность 1,0 на тренировочном наборе, а иногда и на проверочном наборе, меня беспокоят значения функций стоимости. Моя модель выводит очень большие логиты, и если я софтмаксирую эти логиты, я всегда получаю 100% вероятность «хорошего» или «плохого». Следовательно, если моя модель правильно предсказывает пример, стоимость (рассчитанная как cross_entropy_with_logits) равна 0. Если все обучающие примеры предсказаны правильно, веса больше не меняются, и моя модель не улучшает производительность на проверочном наборе.

Вот примеры результатов моей модели (партия, содержащая 10 примеров):

  Logits
    [[ 2169.41455078  2981.38574219]
 [ 2193.54492188  3068.97509766]
 [ 2185.86743164  3060.24047852]
 [ 2305.94604492  3198.36083984]
 [ 2202.66503906  3136.44726562]
 [ 2305.78076172  2976.58081055]
 [ 2248.13232422  3130.26123047]
 [ 2259.94726562  3132.30200195]
 [ 2290.61303711  3098.0871582 ]
 [ 2500.9609375   3188.67456055]]

    Softmax:
   [[ 0.  1.]
 [ 0.  1.]
 [ 0.  1.]
 [ 0.  1.]
 [ 0.  1.]
 [ 0.  1.]
 [ 0.  1.]
 [ 0.  1.]
 [ 0.  1.]
 [ 0.  1.]]

    cost calculated with tf.nn.softmax_cross_entropy_with_logits
     [ 811.97119141    0.          874.37304688    0.          933.78222656
  670.80004883    0.            0.          807.47412109    0.        ]

Как вы думаете, в чем здесь проблема? Моя CNN слишком сложна для приложения и выводит 100% вероятности? Мой CNN просто переоснащается? Вам отсев поможет?


person Marcin    schedule 23.06.2017    source источник


Ответы (1)


Проблема в переоснащении. Для ее решения есть несколько идей:

  1. увеличить набор обучающих данных, либо собрав больше данных, либо сгенерировав преобразованные изображения на основе существующего набора данных.
  2. включают регуляризацию, регуляризацию L1/L2, норму партии, отсев.
  3. рассмотрите возможность использования предварительно обученной модели, которая называется Transfer Learning, см. этого руководства.
person Da Tong    schedule 23.06.2017
comment
Спасибо за ответ. Сейчас я использую регуляризацию весов и слой отсева, но это не решило проблему. Я также добавил активации Relu ко всем слоям conv. Эта операция увеличила стоимость до сотен тысяч и миллионов и сохранила очень высокую точность (более 0,99). Возможно ли, что проблема вызвана очень маленьким набором данных (500 примеров)? - person Marcin; 26.06.2017
comment
500 примеров — это небольшой набор данных. Если вы можете собрать больше данных, больший набор данных определенно уменьшит переоснащение. Пробовали ли вы увеличить скорость выпадения, чтобы увидеть, падает ли точность? - person Da Tong; 26.06.2017
comment
Да, я пытался увеличить скорость выпадения, и точность немного снизилась. Выходные логиты моей модели все еще очень велики, что приводит к классификации 1,0 или 0,0. - person Marcin; 27.06.2017
comment
Возможно, вам следует уменьшить пропускную способность сети. Уменьшите количество скрытых единиц или используйте меньше слоев. Возможно, вам следует проверить, нет ли утечки данных. - person Da Tong; 27.06.2017