Создание моделей с нуля для выполнения уже решенных задач не сэкономит ваше время и ресурсы. Техника трансферного обучения намного лучше!
Введение
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
вот ссылка на мой код:
Цитируемая литература
Читать или смотреть:
- Полное практическое руководство по переносу обучения с помощью реальных приложений в глубокое обучение
- Перенос обучения
- Перенос обучения и тонкой настройки
Определения для просмотра:
Ссылки: