Обучение Tensorflow Inception-v3 Imagenet по скромной аппаратной настройке
Я тренировал Inception V3 на скромной машине с одним графическим процессором (GeForce GTX 980 Ti, 6 ГБ). Максимальный размер партии составляет около 40
,
Я использовал настройки скорости обучения по умолчанию, указанные в inception_train.py
файл: initial_learning_rate = 0.1
, num_epochs_per_decay = 30
а также learning_rate_decay_factor = 0.16
, После нескольких недель обучения лучшая точность, которую я смог достичь, заключается в следующем (около 500K-1M итераций):
2016-06-06 12:07:52.245005: precision @ 1 = 0.5767 recall @ 5 = 0.8143 [50016 examples]
2016-06-09 22:35:10.118852: precision @ 1 = 0.5957 recall @ 5 = 0.8294 [50016 examples]
2016-06-14 15:30:59.532629: precision @ 1 = 0.6112 recall @ 5 = 0.8396 [50016 examples]
2016-06-20 13:57:14.025797: precision @ 1 = 0.6136 recall @ 5 = 0.8423 [50016 examples]
Я попытался поиграть с настройками к концу тренировки, но не увидел каких-либо улучшений в точности.
Я начал новую тренировку с нуля с num_epochs_per_decay
= 10 и learning_rate_decay_factor
= 0,001, основываясь на некоторых других сообщениях в этом форуме, но здесь вроде как в темноте.
Любые рекомендации по хорошим настройкам по умолчанию для небольшой установки оборудования, как у меня?
2 ответа
TL,DR. Не существует известного метода обучения модели Inception V3 с нуля в течение приемлемого периода времени при использовании скромного оборудования. Я настоятельно рекомендую переподготовку предварительно обученной модели для выполнения желаемой задачи.
На небольшом оборудовании, подобном вашему, будет сложно добиться максимальной производительности. Вообще говоря, для CNN лучшая производительность - при максимально возможном размере партии. Это означает, что для CNN процедура обучения часто ограничена максимальным размером пакета, который может поместиться в памяти GPU.
Модель Inception V3, доступная для загрузки здесь, прошла обучение с эффективным размером пакета 1600 для 50 графических процессоров, где каждый графический процессор имел размер пакета 32.
Учитывая ваше скромное аппаратное обеспечение, мое первое предложение было бы загрузить предварительно обученный режим по ссылке выше и переобучить модель для конкретной задачи, которая у вас есть. Это сделало бы вашу жизнь намного счастливее.
В качестве мысленного эксперимента (но вряд ли практического)... если вы чувствуете, что вам особенно необходимо точно сопоставить тренировочную производительность модели с предварительно обученной моделью с нуля, вы можете выполнить следующую безумную процедуру на своем 1 графическом процессоре. А именно, вы можете запустить следующую процедуру:
- Запуск с размером партии 32
- Храните градиенты от пробега
- Повторите это 50 раз.
- Средние градиенты из 50 партий.
- Обновите все переменные с помощью градиентов.
- Повторение
Я упоминаю об этом только для того, чтобы дать вам концептуальное представление о том, что нужно сделать для достижения точно такой же производительности. Учитывая числа скоростей, которые вы упомянули, эта процедура может занять месяцы. Вряд ли практично.
Более реалистично, если вы все еще сильно заинтересованы в обучении с нуля и стараетесь изо всех сил, вот несколько общих рекомендаций:
- Всегда работайте с максимально возможным размером партии. Похоже, вы уже делаете это. Отлично.
- Убедитесь, что вы не привязаны к процессору. То есть, убедитесь, что очереди обработки ввода всегда скромно заполнены, как показано на TensorBoard. Если нет, увеличьте количество потоков предварительной обработки или используйте другой процессор, если он доступен.
- Re: скорость обучения. Если вы всегда выполняете синхронное обучение (что должно быть в случае, если у вас только 1 графический процессор), то чем больше размер пакета, тем выше допустимая скорость обучения. Я хотел бы попробовать серию из нескольких быстрых прогонов (например, по несколько часов каждый), чтобы определить максимально возможное обучение, которое не приводит к NaN. После того, как вы найдете такую скорость обучения, сбейте ее, скажем, на 5-10% и бегите с этим.
- Что касается num_epochs_per_decay и decay_rate, существует несколько стратегий. Стратегия, обозначенная 10 эпохами на одно затухание, коэффициент затухания 0,001, состоит в том, чтобы как можно дольше моделировать модель до тех пор, пока асимптотическая точность оценки не будет асимптотической. А затем понизьте скорость обучения. Это простая стратегия, которая хороша. Я хотел бы убедиться, что именно то, что вы видите в своей модели мониторинга, что оценка точности и определение того, что это действительно асимптотически, прежде чем позволить модели затухать скорость обучения. Наконец, фактор затухания немного нестандартный, но снижение, скажем, степени 10, кажется хорошим практическим правилом.
Обратите внимание, что это общие рекомендации, и другие могут даже предложить разные советы. Причина, по которой мы не можем дать вам более конкретные рекомендации, заключается в том, что CNN такого размера просто не часто обучаются с нуля на скромной установке оборудования.
Отличные советы. При обучении используется приоритет, аналогичный вашему. Проверьте это - http://3dvision.princeton.edu/pvt/GoogLeNet/ Эти люди обучали GoogleNet, но с использованием Caffe. Тем не менее, изучение их опыта было бы полезно.