Создание моделей с нуля для выполнения уже решенных задач не сэкономит ваше время и ресурсы. Техника трансферного обучения намного лучше!

Введение

Transfer Learning — еще одна концепция машинного обучения. Это когда мы строим модель обучения на основе предыдущих знаний (мы внедряем уже обученные модели — знания = веса и смещения)

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

Набор данных: ЦИФАР-10

Набор данных CIFAR-10 состоит из 60000 цветных изображений 32x32 в 10 классах, по 6000 изображений в каждом классе. Имеется 50 000 обучающих изображений и 10 000 тестовых изображений:
* пять обучающих пакетов (10 000 изображений)
* один тестовый пакет (10 000 изображений)

Приложение InceptionV3 Keras

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

Моя окончательная модель была построена с использованием модели inceptionV3.

Реализация кода

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

# fitting results
Epoch 1/4
167/167 [==============================] - 470s 3s/step - loss: 0.8206 - accuracy: 0.7439 - val_loss: 0.4804 - val_accuracy: 0.8421
Epoch 2/4
167/167 [==============================] - 431s 3s/step - loss: 0.4708 - accuracy: 0.8439 - val_loss: 0.4306 - val_accuracy: 0.8550
Epoch 3/4
167/167 [==============================] - 431s 3s/step - loss: 0.4224 - accuracy: 0.8590 - val_loss: 0.4088 - val_accuracy: 0.8622
Epoch 4/4
167/167 [==============================] - 431s 3s/step - loss: 0.3918 - accuracy: 0.8695 - val_loss: 0.3903 - val_accuracy: 0.8687
# evaluating results
313/313 [==============================] - 90s 277ms/step - loss: 0.3903 - accuracy: 0.8687

Точность полученной нами модели неплохая, 86%, но ее можно улучшить.

Мы будем использовать метод тонкой настройки:
после обучения модели мы разморозим некоторые слои в модели base_inception. (наша предварительно обученная модель из приложений keras). Затем будем совместно обучать оба эти слоя и ту часть, которую мы добавили (к модели base_inception)

В качестве отправной точки я решил разморозить слои со 164-го слоя (именно начиная со слоя Mix5 в начальной модели!), затем я перекомпилирую модель и посмотрю, что у нас получится, мы надеемся, что не переборщить. -подходящая точка!

Полученные результаты

Epoch 1/4
Epoch 1/4
167/167 [==============================] - 437s 3s/step - loss: 0.3574 - accuracy: 0.8798 - val_loss: 0.3781 - val_accuracy: 0.8711
Epoch 2/4
167/167 [==============================] - 430s 3s/step - loss: 0.3544 - accuracy: 0.8811 - val_loss: 0.3768 - val_accuracy: 0.8732
Epoch 3/4
167/167 [==============================] - 430s 3s/step - loss: 0.3521 - accuracy: 0.8807 - val_loss: 0.3762 - val_accuracy: 0.8730
Epoch 4/4
167/167 [==============================] - 430s 3s/step - loss: 0.3491 - accuracy: 0.8821 - val_loss: 0.3757 - val_accuracy: 0.8724
############
313/313 [==============================] - 84s 268ms/step - loss: 0.3757 - accuracy: 0.8724

как вы можете видеть, результат был улучшен без переоснащения!

Больше экспериментов

Еще один эксперимент, который стоит попробовать, это 1- использование обратных вызовов. Keras ранняя остановка обучения с помощью обратного вызова EarlyStopping. 2-добавить больше эпох.

Результат последнего эксперимента

Epoch 1/10
167/167 [==============================] - 200s 1s/step - loss: 0.3344 - accuracy: 0.8852 - val_loss: 0.3620 - val_accuracy: 0.8768
Epoch 2/10
167/167 [==============================] - 202s 1s/step - loss: 0.3217 - accuracy: 0.8908 - val_loss: 0.3598 - val_accuracy: 0.8768
Epoch 2: early stopping

вот ссылка на мой код:



Цитируемая литература

Читать или смотреть:

Определения для просмотра:

Ссылки: