Сверточное нейросетевое переоснащение. Выпадение не помогает

16

Я немного играю с конвеетами. В частности, я использую набор данных kaggle cats-vs-dogs, который состоит из 25000 изображений, помеченных как кошки или собаки (по 12500 изображений).

Мне удалось достичь около 85% точности классификации на моем тестовом наборе, однако я поставил цель добиться точности 90%.

Моя главная проблема - переоснащение. Каким-то образом это всегда происходит (обычно после 8-10 эпох). Архитектура моей сети слабо вдохновлена ​​VGG-16, более конкретно, мои изображения изменены до 128Икс128Икс3 , а затем я запускаю:

Convolution 1 128x128x32 (kernel size is 3, strides is 1)
Convolution 2 128x128x32 (kernel size is 3, strides is 1)
Max pool    1 64x64x32   (kernel size is 2, strides is 2)
Convolution 3 64x64x64   (kernel size is 3, strides is 1)
Convolution 4 64x64x64   (kernel size is 3, strides is 1)
Max pool    2 32x32x64   (kernel size is 2, strides is 2)
Convolution 5 16x16x128  (kernel size is 3, strides is 1)
Convolution 6 16x16x128  (kernel size is 3, strides is 1)
Max pool    3 8x8x128    (kernel size is 2, strides is 2)
Convolution 7 8x8x256    (kernel size is 3, strides is 1)
Max pool    4 4x4x256    (kernel size is 2, strides is 2)
Convolution 8 4x4x512    (kernel size is 3, strides is 1)
Fully connected layer 1024 (dropout 0.5)
Fully connected layer 1024 (dropout 0.5)

Все слои, кроме последнего, имеют реус как функции активации.

Обратите внимание, что я пробовал разные комбинации сверток (я начал с более простых сверток).

Кроме того, я дополнил набор данных зеркальным отображением изображений, так что в общей сложности у меня есть 50000 изображений.

Кроме того, я нормализую изображения, используя минимальную максимальную нормализацию, где X - изображение

Иксзнак равноИкс-0/255-0

Код написан в тензорном потоке, а размер пакета равен 128.

Мини-партии обучающих данных заканчивают переобучением и имеют точность 100%, в то время как данные проверки, кажется, перестают учиться на уровне 84-85%.

Я также пытался увеличить / уменьшить коэффициент отсева.

Используемым оптимизатором является AdamOptimizer со скоростью обучения 0,0001.

В настоящее время я играю с этой проблемой последние 3 недели, и 85%, кажется, поставили передо мной барьер.

Кстати, я знаю, что могу использовать трансферное обучение для достижения гораздо более высоких результатов, но мне интересно создавать эту сеть как самообучающийся опыт.

Обновить:

Я использую ту же самую сеть с другим размером пакета, в этом случае я использую пакет намного меньшего размера (16 вместо 128), пока я достигаю точности 87,5% (вместо 85%). Тем не менее, сеть в конечном итоге перегружается. Тем не менее, я не понимаю, как отсев 50% единиц не помогает ... очевидно, я делаю что-то здесь не так. Есть идеи?

Обновление 2:

Похоже, что проблема была связана с размером пакета, так как с меньшим размером (16 вместо 128) я достигаю точности 92,8% на моем тестовом наборе, с меньшим размером пакета сеть все еще перегружается (мини-пакеты заканчиваются с точностью до 100%) однако потери (погрешности) продолжают уменьшаться и в целом более стабильны. Минусы - НАМНОГО более медленное время работы, но оно того стоит.

Хуан Антонио Гомес Мориано
источник
2
Не могли бы вы дать более подробную информацию о вашей оценке переоснащения? Например, падает ли точность проверки в любой точке, наряду с отклонениями от результатов обучения и проверки? Как насчет функции потерь?
Нил Слэйтер
Хороший вопрос, поэтому под переоснащением я подразумеваю тот факт, что мини-партии в поезде достигают точности 100% и потерь 0,08, тогда как валидация, кажется, никогда не опускается ниже 0,35, а ее точность остается на уровне 88%. Что касается валидации, она, кажется, не падает (по крайней мере, не слишком сильно), кажется, становится плоской, однако почему мини-партия достигла таких низких потерь, в то время как валидация еще далека от нее?
Хуан Антонио Гомес
Я не знаю ответа для вас, однако такое поведение - большое расхождение между поездом и валидацией, но все же одобрение плато - это то, что я видел раньше несколько раз. Я почти не решаюсь назвать это слишком подходящим, потому что иногда результаты теста приемлемы.
Нил Слэйтер
«Тем не менее, я не понимаю, как отсев 50% единиц не помогает». Я видел людей, которые с успехом использовали гораздо более высокие значения отсева.
Рикардо Круз,

Ответы:

14

Итак, после долгих экспериментов мне удалось получить некоторые результаты / идеи.

Во-первых, при прочих равных условиях меньшие партии в обучающем наборе очень помогают для повышения общей производительности сети, но, с другой стороны, тренировочный процесс намного медленнее.

Второй момент: данные важны, здесь нет ничего нового, но, как я узнал, борясь с этой проблемой, всегда кажется, что больше данных помогает.

В-третьих, выпадение полезно в больших сетях с большим количеством данных и большим количеством итераций, в моей сети я применил выпадение только к последним полностью подключенным слоям, слои свертки не применялись к выпадению.

Четвертый пункт (и это то, что я изучаю много раз): нейронные сетевые слова требуют ОЧЕНЬ много, даже на хороших графических процессорах (я обучал эту сеть на floydhub, который использует довольно дорогие карты NVIDIA), так что PATIENCE является ключевым .

Окончательный вывод: размеры партий более важны, чем можно подумать, по-видимому, легче достичь локального минимума, когда партии больше.

Код, который я написал, доступен в виде записной книжки Python, я думаю, что он хорошо документирован

https://github.com/moriano/loco-learning/blob/master/cats-vs-dogs/cats-vs-dogs.ipynb

Хуан Антонио Гомес Мориано
источник
Спасибо за публикацию ваших результатов. Быстрый вопрос: Я столкнулся с аналогичной проблемой , и я видел это в записной книжке вы публикуемые: NOTE USE EITHER mean centering or min-max, NOT BOTH. В настоящее время я input_fnделю свои входные изображения на 255 внутри моего (API Tensorflow Estimator). Затем внутри модели я запускаю этот ввод через пакетную норму. Должен ли я сделать только одну из этих нормализаций? См github.com/formigone/tf-imagenet/blob/master/models/...
Rodrigo-Сильвейре
Я понимаю, что деление на 255 выполняется только один раз для каждого изображения, и причина состоит в том, чтобы сохранить все значения от 0 до 1, поскольку это обеспечит числовую стабильность.
Хуан Антонио Гомес Мориано
Конечно, я понимаю. Но считаете ли вы, что имеет смысл также нормализовать эти значения в диапазоне [0, 1]?
Родриго-Сильвейра
Это, я не знаю, прошло много времени с тех пор, как я использовал пакетную нормализацию :)
Хуан Антонио Гомес Мориано
3

Я предлагаю вам проанализировать учебные планы вашей точности проверки, как предложил Нил Слэйтер. Затем, если точность проверки падает, попытайтесь уменьшить размер вашей сети (кажется, слишком глубоким), добавьте выпадение в слои CONV и BatchNormalization после каждого слоя. Это может помочь избавиться от переоснащения и повысить точность теста.

HatemB
источник
Спасибо за совет, попробую, однако у меня сложилось впечатление, что слои CONV не требуют выпадения, в большинстве прочитанных мною статей выпадение, кажется, применяется всегда к конечным полностью соединенным слоям, а не к сверткам.
Хуан Антонио Гомес
3

Есть несколько возможных решений вашей проблемы.

  1. Используйте Dropout в более ранних слоях (сверточных слоях) тоже.

  2. Ваша сеть кажется довольно большой для такой «легкой» задачи; попытаться уменьшить это. Большие архитектуры также обучаются на гораздо больших наборах данных.

Если вы хотите сохранить свою «большую» архитектуру, попробуйте:

  1. Увеличение изображения с целью виртуального увеличения ваших тренировочных данных

  2. Попробуйте состязательное обучение. Это иногда помогает.

Андреас Смотри
источник
«Ваша сеть кажется довольно большой для такой« легкой »задачи; попробуйте уменьшить ее. Большие архитектуры также обучаются на гораздо больших наборах данных». Я не согласен, так как я добавил больше извилин, точность увеличилась (первоначально я достигал 68% всего за два свертки). Кроме того, я уже дополняю свой набор данных, я оперирую с 50000 изображений.
Хуан Антонио Гомес
2

Одна вещь, которая еще не была упомянута, и которую вы можете рассмотреть на будущее: вы все равно можете увеличить свой отсев на полностью связанных слоях.

Однажды я прочитал статью, в которой использовалось 90% отсева. Хотя в нем было много узлов (2048, если я правильно помню), я пробовал это сам на слоях с меньшим количеством узлов, и в некоторых случаях это было очень полезно.

Я просто посмотрел, какая это бумага. Я не могу вспомнить, какую бумагу я только что вспомнил, но я нашел их, которые также имели некоторый успех с 90% отсева.

Karpathy, A., Toderici, G., Shetty, S., Leung, T., Sukthankar R., & Fei-Fei, L. (2014). Масштабная классификация видео со сверточными нейронными сетями. В материалах конференции IEEE по компьютерному зрению и распознаванию образов (стр. 1725-1732).

Симонян К. и Зиссерман А. (2014). Двухпоточные сверточные сети для распознавания действий в видео. В Достижения в нейронных системах обработки информации (стр. 568-576).

Вароль Г., Лаптев И. и Шмид С. (2017). Долгосрочные временные свертки для распознавания действий. IEEE транзакции по анализу паттернов и машинному интеллекту.

kefbach
источник
0

У меня тоже была эта пробема. Потратив на это много часов, я случайно решил перетасовать данные, прежде чем вводить их в систему, и вуаля, они начали работать. Мне понадобилось немного времени, чтобы понять, что именно тасовка сделала свое дело! Надеюсь, это спасет кого-то от разочарования!

user79129
источник