Что такое трансферное обучение?

Трансферное обучение — это метод, который сокращает многое из этого, беря часть модели, которая уже была обучена для связанной задачи, и повторно используя ее в новой модели.

Здесь я использую Google Colab, который обеспечивает интеграцию оперативной памяти и графического процессора в браузере :)

Шаг 1. Установка

Шаг 2. Настройка конвейера ввода

Загрузка набора данных цветов…

Используйте ImageDataGenerator для масштабирования изображений.

Создайте обученный генератор и укажите, где обучать каталог набора данных, размер изображения, размер пакета.

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

После запуска приведенного выше кода вы увидите 2939 изображений для обучения и 731 для набора данных проверки, как показано на снимке экрана ниже:

Создайте базовую модель из предварительно обученных консетей (сверточная сеть). Создайте базовую модель на основе модели MobileNet V2, разработанной в Google и предварительно обученной на наборе данных ImageNet, большом наборе данных из 1,4 млн изображений и 1000 классов веб-изображений.

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

Давайте создадим экземпляр модели MobileNet V2 с предварительно загруженными весами, обученными в ImageNet. Указав аргумент include_top=False, мы загружаем сеть, которая не включает слои классификации вверху, что идеально подходит для извлечения признаков.

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

base_model.trainable = Ложь

Добавить заголовок классификации

Скомпилируйте модель Вы должны скомпилировать модель перед ее обучением. Поскольку существует несколько классов, используйте категориальную кросс-энтропийную потерю

model.compile(optimizer=tf.keras.optimizers.Adam(),

потеря=’categorical_crossentropy’,

metrics=['точность'])

Кривые обучения

Давайте посмотрим на кривые обучения точности/потери обучения и проверки при использовании базовой модели MobileNet V2 в качестве средства извлечения фиксированных признаков.

Тонкая настройка

В нашем эксперименте по извлечению признаков вы обучали только несколько слоев поверх базовой модели MobileNet V2. Веса предварительно обученной сети не обновлялись во время обучения.

Одним из способов еще большего повышения производительности является обучение (или «точная настройка») весов верхних слоев предварительно обученной модели наряду с обучением добавленного вами классификатора. Процесс обучения заставит настраивать веса от общих карт объектов к функциям, связанным конкретно с нашим набором данных.

Разморозить верхние слои модели

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

Компиляция модели

Конвертировать в TFLite

Сохранил модель с помощью tf.saved_model.save, а затем преобразовал сохраненную модель в формат, совместимый с tf lite.

Загрузить преобразованную модель и этикетки

saved_model_dir = ‘сохранить/тонкая_настройка’

tf.saved_model.save(model, save_model_dir)

converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)

tflite_model = convert.convert()

с open(‘model.tflite’, ‘wb’) как f:

f.write(tflite_model)

из файлов импорта google.colab

files.download(‘model.tflite’)

files.download(‘labels.txt’)

Давайте посмотрим на кривые обучения точности/потери обучения и проверки при точной настройке последних нескольких слоев базовой модели MobileNet V2 и обучении классификатора поверх нее. Потери при проверке намного выше, чем потери при обучении, поэтому вы можете получить некоторое переоснащение.

Вы также можете получить некоторое переоснащение, поскольку новый обучающий набор относительно мал и похож на исходные наборы данных MobileNet V2.

Выходной график приведенного выше кода: -

Резюме:-

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

Это делается путем создания экземпляра предварительно обученной модели и добавления полносвязного классификатора сверху. Предварительно обученная модель «замораживается», и во время обучения обновляются только веса классификатора.

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

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

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

Полный код Github: -