В случае сомнений используйте данные, чтобы принять решение!

Решение, какую предварительно обученную модель использовать в вашей задаче глубокого обучения, находится на одном уровне с классическими дилеммами, например, какой фильм смотреть на Netflix и какие хлопья покупать в супермаркете (PS купите ту, которая с наименьшим содержанием сахара и наибольшим содержанием клетчатки) . В этом посте будет использоваться подход на основе данных в Python, чтобы найти лучшую предварительно подготовленную модель Keras для cats_vs_dogs dataset. Этот пост и предоставленный код также помогут вам легко выбрать лучшую предварительно подготовленную модель для набора данных вашей проблемы.

Оглавление

  1. "Фон"
  2. Критерии выбора моделей
  3. "Код"
  4. "Ресурсы"

Фон

Трансферное обучение - это метод машинного обучения, при котором мы можем взять модель, разработанную для одной задачи, и использовать ее в качестве отправной точки для некоторых других похожих, но разных задач. Трансферное обучение чрезвычайно популярно в глубоком обучении, поскольку перенос знаний от одной родительской модели к дочерней модели означает, что дочерняя модель может быть обучена с высокой точностью с гораздо меньшим набором данных по сравнению с родительской. »Модель. Вы можете найти более подробную информацию о трансферном обучении в этом отличном [Средний пост]

Фреймворки глубокого обучения высокого уровня, такие как TensorFlow и Pytorch, позволили невероятно легко использовать возможности трансферного обучения, включив в сам пакет несколько предварительно обученных моделей. Например, [TensorFlow Keras API] включает 18 высокотехнологичных архитектур моделей, предварительно обученных на наборе данных [« ImageNet ]». Вы можете думать об ImageNet как о SAT наборов данных классификации изображений.

Большинство задач глубокого обучения классификации изображений сегодня начинается с загрузки одной из этих 18 предварительно обученных моделей, небольшого изменения модели в соответствии с выполняемой задачей и обучения только пользовательским модификациям при замораживании слоев в предварительно обученной модели. Такой подход обеспечивает очень высокую точность при решении задач классификации реальных изображений, поскольку «ImageNet» собирает множество реальных изображений.

Однако выбор того, какую из 18 предварительно обученных моделей использовать, не всегда является точной наукой. Многие разработчики придерживаются тех моделей, с которыми они знакомы, и давали им хорошие результаты в прошлом. Как специалист по данным, я задавался вопросом, есть ли лучший, основанный на данных подход к выбору предварительно обученной модели, свободный от личных предубеждений. Действительно есть! Остальная часть этого поста рассказывает о моем процессе с кодом, который вы можете напрямую использовать в своих проектах.

Критерии выбора моделей

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

  1. Точность модели: выше лучше
  2. Скорость обучения модели и прогнозов: быстрее, лучше

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

Достаточно просто? Ну, как и все в жизни, мы не можем съесть свой торт и съесть его (отсюда и заглавное изображение)! В общем, чтобы получить более высокую точность, нам нужно использовать более глубокую или более крупную модель. Но у более крупной модели гораздо больше параметров, которые замедляют ее выполнение. Мы можем увидеть компромисс между точностью и размером / количеством операций модели из приведенного ниже графика [Ссылка].

Итак, мы должны найти баланс. Для большинства развертываний Deep Learning в отрасли мы выбираем самую маленькую модель, которая обеспечивает достаточно хорошую точность. Таким образом, нам нужно поэкспериментировать среди множества доступных моделей, чтобы выбрать ту, которая соответствует этим критериям.

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

Код

Мой подход прост, как показано на изображении ниже. Мы будем использовать Python, чтобы найти все предварительно обученные модели в Keras, а затем перебрать их одну за другой. В этом посте мы обучим модели на наборе данных TensorFlow [cats_vs_dogs]. Вы можете заменить его любым другим набором данных, включая свой собственный набор данных.

Шаг 1

Первый шаг - импортировать необходимые пакеты. Если у вас нет этих пакетов, вы можете установить их с помощью pip install <package-name>. Мы также установим batch_size для последующего обучения модели. Поскольку я использую недорогой графический процессор, я буду использовать небольшой размер batch_size, равный 32.

Шаг 2

Автоматически получите список всех доступных предварительно обученных моделей от Keras, перечислив все функции внутри tf.keras.applications. Поскольку каждая модель создается путем вызова функции из tf.keras.applications, когда мы перечисляем все функции в этом модуле с помощью inspect.isfunction, мы получаем список всех моделей. На момент написания этой статьи в [Tensorflow 2.2] всего 18 моделей, которые мы можем использовать.

Вы можете добавить в эксперименты любые другие настраиваемые предварительно обученные модели, вручную добавив элементы в model_dictionary, а также следуя синтаксису model_dictionary["new_model_name"] = new_model_function(), где new_model_function() должен возвращать настраиваемую предварительно обученную модель без окончательного выходного слоя Dense. Форма ввода модели должна быть (224,224,3), если вы не хотите изменять какой-либо другой код ниже.

Шаг 3

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

Выход:

Num train images: 16283         
Num validation images: 6979         
Num classes: 2         
Num iterations per epoch: 508

Шаг 4

Предварительно обработайте входные изображения. Некоторые предварительно обученные модели требуют, чтобы изображения были размером (224,224,3), а некоторые - (331,331,3). Мы используем этот шаг, чтобы подготовить оба размера изображений и нормализовать их, разделив каждый пиксель на 255. Мы также горячим кодированием меток, чтобы мы могли использовать categorical_crossentropy loss во время обучения.

Шаг 5

Прокрутите каждую модель, загрузив предварительно обученную модель без выходных слоев, и зафиксируйте веса. Затем мы создаем пустую Sequential модель и сначала добавляем к ней предварительно обученную модель. Затем мы добавляем один выходной плотный слой с softmax активацией и компилируем его с categorical_crossentropy потерями. Наконец, мы обучаем модель, вызывая model.fit для 3 epochs. Мы записываем количество параметров (размер модели) и окончательную точность каждой модели в словарь для визуализации результатов. Если при загрузке модели AttributeError: 'str' object has no attribute 'decode' вы получите следующую ошибку, установите младшую версию h5py [источник]

pip uninstall h5py
pip install h5py<'3.0.0'

Весь процесс занимает ~ 3 часа на n1-standard-4 (4 виртуальных ЦП, 15 ГБ ОЗУ) с одним NVIDIA Tesla T4 GPU в Google Cloud Platform.

ШАГ 6

Давайте визуализируем результаты, преобразовав их в DataFrame и отсортируя их в порядке возрастания num_model_params, поскольку наша цель - выбрать наименьшую модель с достаточно хорошей точностью. В этом примере модель MobileNet уже обеспечивает точность 97%; таким образом, мы можем использовать его напрямую. MobileNetV2 и NASNetMobile - две другие модели, которые мы можем рассмотреть для экспериментов по тонкой настройке. Если точность выбранной нами модели все еще недостаточна для нашей задачи, мы можем поэкспериментировать, уточняя эти выбранные модели, добавив дополнительные данные и т. Д. Мы будем применять типичные эксперименты по улучшению модели глубокого обучения на модели, которая уже доказала свою близость. нашим требованиям.

Выход:

| model_name        | num_model_params | validation_accuracy |
|-------------------|------------------|---------------------|
| MobileNetV2       | 2257984          | 0.9475569725036621  |
| MobileNet         | 3228864          | 0.9773606657981873  |
| NASNetMobile      | 4269716          | 0.9753546118736267  |
| DenseNet121       | 7037504          | 0.9273535013198853  |
| DenseNet169       | 12642880         | 0.95572429895401    |
| VGG16             | 14714688         | 0.9107322096824646  |
| DenseNet201       | 18321984         | 0.9419687390327454  |
| VGG19             | 20024384         | 0.8948273658752441  |
| Xception          | 20861480         | 0.9550078511238098  |
| InceptionV3       | 21802784         | 0.9859578609466553  |
| ResNet50V2        | 23564800         | 0.9802263975143433  |
| ResNet50          | 23587712         | 0.49620288610458374 |
| ResNet101V2       | 42626560         | 0.9878206253051758  |
| ResNet101         | 42658176         | 0.49620288610458374 |
| InceptionResNetV2 | 54336736         | 0.9885370135307312  |
| ResNet152V2       | 58331648         | 0.9840951561927795  |
| ResNet152         | 58370944         | 0.49620288610458374 |
| NASNetLarge       | 84916818         | 0.9795099496841431  |

Постройте результаты

Заключение

В заключение я представил управляемый данными подход для выбора наиболее подходящей модели из группы предварительно обученных моделей в Tensorflow Keras API. В большинстве промышленных приложений мы бы выбрали модель с наименьшим количеством параметров, обеспечивающих достаточно хорошую точность для дальнейшего исследования. Мы можем легко расширить этот подход, включив в него другие модели, не предлагаемые Keras, вручную добавив элементы в model_dictionary в [Шаг 2].

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

Ресурсы

  • Вы можете найти весь код, использованный в этом посте, на [GitHub].
  • Вы также можете использовать Google Colab для запуска кода напрямую без какой-либо настройки. Просто не забудьте зайти в Edit → Notebook Settings и выбрать GPU Hardware Accelerator: [Открыть в Colab]
  • Также посетите мой канал YouTube для видеоконтента: [https://youtube.com/agnidata]

Спасибо за чтение!

Изменить: обновлены фрагменты кода для GitHub gists