Ваша нейронная сеть работает плохо? Ваши вычислительные ресурсы ограничены? Не волнуйся; есть еще надежда! Хватай кофе, и вперед за новым приключением! = Д

Введение

Сегодня я покажу вам, как Transfer Learning может помочь улучшить качество вашей модели, сократить время обучения и меньше тратить на CPU, GPU и TPU. Все это с простой реализацией!

Как это возможно?

Перенос обучения

Transfer Learning — это повторное использование уже обученной модели и ее расширение (добавление и обучение последних слоев с вашими собственными данными).

Чтобы проиллюстрировать, как работает этот процесс, давайте построим нейронную сеть для классификации кошек и собак. Затем мы создадим вторую нейронную сеть с помощью Transfer Learning и сможем их сравнить!

НАЧИНАТЬ!

Сначала самое главное!

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

Здесь мы загружаем cat_vs_dogs с метаданными и разделяем между обучением и проверкой (80–20). Вы можете найти этот набор данных здесь вместе с несколькими другими.

Работа с данными

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

Для корректной работы модели значения пикселей необходимо нормализовать [0, 1], а не стандартным способом [0, 255].

Давайте создадим функцию, которая делает и то, и другое!

ХОРОШО! Теперь давайте создадим обучающую и проверочную партии! Не забудьте применить предварительную выборку, которая подготовит следующие данные во время обработки текущих данных, сократив время, необходимое для обучения.

Первый снимок

Итак, давайте построим нашу первую нейронную сеть!

Здесь у нас есть резюме сети!

Как видите, у нас есть несколько слоев с парами Conv и MaxPooling. Сверточный слой отвечает за применение фильтра (ядра) к различным областям входного изображения. Максимальный пул уменьшает размер входного изображения (в данном случае выбирая наибольшее значение из сетки).

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

Примечание: свертка x корреляция

Операция, которую мы часто называем сверткой, на самом деле является корреляцией! Эти два процесса очень похожи, разница в том, что при свертке мы поворачиваем фильтр на 180°, прежде чем применять его к изображению. Если вы хотите узнать больше об этой разнице, ознакомьтесь с отличной статьей (спасибо Нассеру Боану за рекомендацию).

ХОРОШО! Теперь пришло время скомпилировать и обучить нашу модель!

Модель была скомпилирована с помощью оптимизатора Adam, точности и кросс-энтропии. Мы проведем обучение на 15 эпох! Посмотрим на результаты!

Как видите, точность нашей модели в проверочном наборе данных не превышала 88 %! Можем ли мы добиться лучших результатов?

Второй снимок

Теперь пришло время для трансферного обучения! Давайте выберем модель, которая уже прошла обучение на сайте TensorFlow Hub!

Я выбрал для этой статьи MobileNet V2, легкую, оптимизированную для мобильных устройств нейронную сеть. Помните стандартное разрешение 224x224? Вы можете найти эту информацию на странице TensorFlow Hub каждой модели.

Первым шагом является загрузка модели без окончательного слоя классификации (вектора признаков).

После загрузки нейронной сети заморозим все слои (чтобы обучить только последний слой).

Теперь давайте создадим модель, аналогичную той, что мы делали раньше, но теперь с помощью feature_extractor. В этом примере мы добавили только выходной слой к вектору объектов, но вы также можете добавить другие слои! (спасибо Габриэлю Кассимиро за указание на это).

Обратите внимание, что теперь у нас есть сеть MobileNet и последний слой Dense! Также обратите внимание, что эта сеть имеет меньше параметров, чем наша предыдущая. Давайте скомпилируем модель и посмотрим на результаты!

Как видите, мы будем тренироваться всего 3 эпохи! И только последний слой!

УХ ТЫ! Наша нейронная сеть имеет точность 98% в наборе данных проверки! В этом сила трансферного обучения!

Сохранение и загрузка модели

Мы можем сохранить модель для последующего использования! Давайте сохраним его в формате HDF5 (.h5), что позволит нам воссоздать модель, даже если у нас нет доступа к коду, создавшему ее!

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

Посмотри, как это просто? Модель теперь в выбранном каталоге!

Чтобы загрузить модель, просто передайте путь и custom_objects (говорит keras, как загрузить hub.KerasLayer) в load_model tf.keras.models!

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

Заключение

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

Теперь твоя очередь! Веселиться!

Это все, друзья!