Оптимальный размер партии и эпохи для больших моделей - PullRequest
0 голосов
/ 19 апреля 2020

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

Это модель классификации изображений. На данный момент я пытаюсь классифицировать 40 разных классов (40 разных видов животных). В каждом классе от 120 до 220 изображений. Мой тренировочный набор состоит из 4708 изображений, а мой набор для проверки - 2512 изображений.

Я запустил последовательную модель (код ниже), где я использовал размер партии 64 и 30 эпох. Код занял много времени для запуска. Точность после 30 эпох составляла около 67 на проверочном наборе и около 70 на тренировочном наборе. Потери в проверочном наборе составили около 1,2 и около 1 в тренировочном наборе (я включил результаты последних 12 эпох ниже). Похоже, что он сужается примерно после 25 эпох.

Мои вопросы касаются размера партии и эпох. Есть ли смысл использовать пакеты большего или меньшего размера (чем 64), и я должен использовать больше эпох? Я читал, что обычно от 50 до 100 эпох - это обычная практика, но если мои результаты сужаются после 25, есть смысл добавлять больше.

Модель

history = model.fit_generator(
    train_data_gen,
    steps_per_epoch= 4708 // batch_size,
    epochs=30,
    validation_data=val_data_gen,
    validation_steps= 2512 // batch_size
)

Результаты

Epoch 18/30
73/73 [==============================] - 416s 6s/step - loss: 1.0982 - accuracy: 0.6843 - val_loss: 1.3010 - val_accuracy: 0.6418
Epoch 19/30
73/73 [==============================] - 414s 6s/step - loss: 1.1215 - accuracy: 0.6712 - val_loss: 1.2761 - val_accuracy: 0.6454
Epoch 20/30
73/73 [==============================] - 414s 6s/step - loss: 1.0848 - accuracy: 0.6809 - val_loss: 1.2918 - val_accuracy: 0.6442
Epoch 21/30
73/73 [==============================] - 413s 6s/step - loss: 1.0276 - accuracy: 0.7013 - val_loss: 1.2581 - val_accuracy: 0.6430
Epoch 22/30
73/73 [==============================] - 415s 6s/step - loss: 1.0985 - accuracy: 0.6854 - val_loss: 1.2626 - val_accuracy: 0.6575
Epoch 23/30
73/73 [==============================] - 413s 6s/step - loss: 1.0621 - accuracy: 0.6949 - val_loss: 1.3168 - val_accuracy: 0.6346
Epoch 24/30
73/73 [==============================] - 415s 6s/step - loss: 1.0718 - accuracy: 0.6869 - val_loss: 1.1658 - val_accuracy: 0.6755
Epoch 25/30
73/73 [==============================] - 419s 6s/step - loss: 1.0368 - accuracy: 0.6957 - val_loss: 1.1962 - val_accuracy: 0.6739
Epoch 26/30
73/73 [==============================] - 419s 6s/step - loss: 1.0231 - accuracy: 0.7067 - val_loss: 1.3491 - val_accuracy: 0.6426
Epoch 27/30
73/73 [==============================] - 434s 6s/step - loss: 1.0520 - accuracy: 0.6919 - val_loss: 1.2039 - val_accuracy: 0.6683
Epoch 28/30
73/73 [==============================] - 417s 6s/step - loss: 0.9810 - accuracy: 0.7151 - val_loss: 1.2047 - val_accuracy: 0.6711
Epoch 29/30
73/73 [==============================] - 436s 6s/step - loss: 0.9915 - accuracy: 0.7140 - val_loss: 1.1737 - val_accuracy: 0.6711
Epoch 30/30
73/73 [==============================] - 424s 6s/step - loss: 1.0006 - accuracy: 0.7087 - val_loss: 1.2213 - val_accuracy: 0.6619

Ответы [ 3 ]

1 голос
/ 19 апреля 2020

Вам следует прерывать процесс обучения только тогда, когда модель больше не «учится», а это означает, что потери и точность данных проверки не улучшаются. Для этого вы можете задать произвольно большое количество эпох и использовать tf.keras.callbacks.EarlyStopping ( документация ). Это прервет процесс обучения, когда будет выполнено определенное условие, например, когда val_loss не уменьшилось за 10 эпох.

es = EarlyStopping(monitor='val_loss', patience=10)
fit_generator(... callbacks=[es])

Это гарантирует, что процесс обучения не будет прерван во время обучения модели, а также что модель не будет соответствовать.

Размер партии 32 стандартно, но этот вопрос более актуален для другого сайта, поскольку касается статистики.

1 голос
/ 19 апреля 2020

Существует три причины выбора размера партии.

  1. Скорость. Если вы используете графический процессор, то большие партии часто обрабатываются почти так же быстро, как и меньшие. Это означает, что отдельные случаи намного быстрее, что означает, что каждая эпоха также быстрее.
  2. Регуляризация. Меньшие партии добавляют регуляризацию, аналогичную увеличению отсева, увеличению скорости обучения или добавлению снижения веса. Большие партии уменьшают регуляризацию.
  3. Ограничения памяти. Это жесткий предел. В определенный момент ваш графический процессор просто не сможет вместить все данные в памяти, и вы больше не сможете увеличивать размер пакета.

Это говорит о том, что большие размеры пакета лучше, пока вы исчерпать память. Если у вас не возникают проблемы с переоснащением, больший и все еще работающий размер партии (1) ускорит обучение и (2) позволит увеличить скорость обучения, что также ускоряет процесс обучения.

Этот второй момент происходит из-за регуляризации. Если вы увеличиваете размер пакета, уменьшенная регуляризация возвращает некоторый «бюджет регуляризации», который нужно потратить на увеличение скорости обучения, что добавит эту регуляризацию обратно.


Кстати, регуляризация - это просто способ понять, насколько шумным или плавным является ваш тренировочный процесс.

Низкая регуляризация означает, что обучение очень плавное, а это означает, что обучение легко сходится но также легко поддается обучению для переобучения.

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

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


По более широкой теме c регуляризации, обучения расписания и настройка гиперпараметров, я настоятельно рекомендую две статьи на эту тему, написанные Lesl ie N. Smith.

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


После этого нет правильных ответов о том, сколько эпох использовать, только руководство. Что я делаю:
  • Сохраняйте график тренировок как можно быстрее, пока вы работаете над моделью. Ускоренное обучение означает, что вы можете попробовать больше идей и более точно настроить свои гиперпараметры.
  • Когда вы по какой-то причине будете готовы к точной настройке результатов (отправка в Kaggle, развертывание модели для производства), тогда вы можете увеличивать эпохи. и выполнить некоторую окончательную настройку гиперпараметров, пока результаты проверки не перестанут улучшаться «достаточно», где «достаточно» - это сочетание вашего терпения и потребности в лучших результатах.
1 голос
/ 19 апреля 2020

Да, если вы можете go для максимально большого размера партии.

Большой размер партии почти всегда приводит к более быстрой конвергенции и сокращению времени обучения. Если у вас есть графический процессор с хорошей памятью, всего на 1014 * больше, чем вы можете.

Что касается эпох, то это трудно решить, так как я могу, ваша модель все еще улучшается в 28-29 эпох. так что вам, возможно, придется потренироваться для большего количества эпох, чтобы получить лучшую модель, но также ищите val_accuracy, похоже, ваш val_a cc тоже улучшается, что говорит о том, что модель нуждается в дополнительном обучении.

Вы можете использовать ModelCheckpoint для хранения модели после каждой эпохи, чтобы получить лучшую версию вашей модели. https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/ModelCheckpoint

Вы можете использовать керас

...