Я немного играю с конвеетами. В частности, я использую набор данных kaggle cats-vs-dogs, который состоит из 25000 изображений, помеченных как кошки или собаки (по 12500 изображений).
Мне удалось достичь около 85% точности классификации на моем тестовом наборе, однако я поставил цель добиться точности 90%.
Моя главная проблема - переоснащение. Каким-то образом это всегда происходит (обычно после 8-10 эпох). Архитектура моей сети слабо вдохновлена VGG-16, более конкретно, мои изображения изменены до , а затем я запускаю:
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 - изображение
Код написан в тензорном потоке, а размер пакета равен 128.
Мини-партии обучающих данных заканчивают переобучением и имеют точность 100%, в то время как данные проверки, кажется, перестают учиться на уровне 84-85%.
Я также пытался увеличить / уменьшить коэффициент отсева.
Используемым оптимизатором является AdamOptimizer со скоростью обучения 0,0001.
В настоящее время я играю с этой проблемой последние 3 недели, и 85%, кажется, поставили передо мной барьер.
Кстати, я знаю, что могу использовать трансферное обучение для достижения гораздо более высоких результатов, но мне интересно создавать эту сеть как самообучающийся опыт.
Обновить:
Я использую ту же самую сеть с другим размером пакета, в этом случае я использую пакет намного меньшего размера (16 вместо 128), пока я достигаю точности 87,5% (вместо 85%). Тем не менее, сеть в конечном итоге перегружается. Тем не менее, я не понимаю, как отсев 50% единиц не помогает ... очевидно, я делаю что-то здесь не так. Есть идеи?
Обновление 2:
Похоже, что проблема была связана с размером пакета, так как с меньшим размером (16 вместо 128) я достигаю точности 92,8% на моем тестовом наборе, с меньшим размером пакета сеть все еще перегружается (мини-пакеты заканчиваются с точностью до 100%) однако потери (погрешности) продолжают уменьшаться и в целом более стабильны. Минусы - НАМНОГО более медленное время работы, но оно того стоит.
источник
Ответы:
Итак, после долгих экспериментов мне удалось получить некоторые результаты / идеи.
Во-первых, при прочих равных условиях меньшие партии в обучающем наборе очень помогают для повышения общей производительности сети, но, с другой стороны, тренировочный процесс намного медленнее.
Второй момент: данные важны, здесь нет ничего нового, но, как я узнал, борясь с этой проблемой, всегда кажется, что больше данных помогает.
В-третьих, выпадение полезно в больших сетях с большим количеством данных и большим количеством итераций, в моей сети я применил выпадение только к последним полностью подключенным слоям, слои свертки не применялись к выпадению.
Четвертый пункт (и это то, что я изучаю много раз): нейронные сетевые слова требуют ОЧЕНЬ много, даже на хороших графических процессорах (я обучал эту сеть на 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/...Я предлагаю вам проанализировать учебные планы вашей точности проверки, как предложил Нил Слэйтер. Затем, если точность проверки падает, попытайтесь уменьшить размер вашей сети (кажется, слишком глубоким), добавьте выпадение в слои CONV и BatchNormalization после каждого слоя. Это может помочь избавиться от переоснащения и повысить точность теста.
источник
Есть несколько возможных решений вашей проблемы.
Используйте Dropout в более ранних слоях (сверточных слоях) тоже.
Ваша сеть кажется довольно большой для такой «легкой» задачи; попытаться уменьшить это. Большие архитектуры также обучаются на гораздо больших наборах данных.
Если вы хотите сохранить свою «большую» архитектуру, попробуйте:
Увеличение изображения с целью виртуального увеличения ваших тренировочных данных
Попробуйте состязательное обучение. Это иногда помогает.
источник
Одна вещь, которая еще не была упомянута, и которую вы можете рассмотреть на будущее: вы все равно можете увеличить свой отсев на полностью связанных слоях.
Однажды я прочитал статью, в которой использовалось 90% отсева. Хотя в нем было много узлов (2048, если я правильно помню), я пробовал это сам на слоях с меньшим количеством узлов, и в некоторых случаях это было очень полезно.
Я просто посмотрел, какая это бумага. Я не могу вспомнить, какую бумагу я только что вспомнил, но я нашел их, которые также имели некоторый успех с 90% отсева.
источник
У меня тоже была эта пробема. Потратив на это много часов, я случайно решил перетасовать данные, прежде чем вводить их в систему, и вуаля, они начали работать. Мне понадобилось немного времени, чтобы понять, что именно тасовка сделала свое дело! Надеюсь, это спасет кого-то от разочарования!
источник