Прежде чем читать эту статью, вы также должны прочитать мою первую статью здесь, потому что в моей первой статье я дал вам обзор моего проекта и мотивацию для этого проекта. Если вы уже прочитали часть 1, пришло время начать .
В этой статье, часть 2, я сосредоточусь на шагах и процессах построения модели классификации изображений. Обычно для создания модели машинного обучения я выполняю следующие шаги:
- Сбор данных (либо из любого источника, либо мы собираем самостоятельно)
- Подготовка данных и разработка функций
- настройка совместной работы гугл
- Построение модели
- Проверка модели и тестирование
1. Сбор данных
В этом проекте я использую данные, которые были опубликованы в Kaggle.
Ссылка на набор данных: https://www.kaggle.com/datasets/chipprogrammer/mashroom-image-classification
Этот набор данных содержит 3017 изображений 16 различных грибов, и они также классифицируют эти 16 грибов как съедобные и несъедобные.
1.1 Загрузите данные из Kaggle на диск
Поскольку для обучения этой модели я использую коллаб Google, мне нужно загрузить набор данных на свой диск Google. Я использую Google Collab, потому что могу обучать свою модель на графическом процессоре, предоставленном Google.
Теперь у нас есть набор данных, давайте изучим его…
2. Настройка совместной работы
Чтобы использовать графический процессор, предоставленный Google, нажмите «Среда выполнения» на панели навигации совместной работы, затем выберите «Графический процессор» в качестве аппаратного ускорителя.
Вы можете просмотреть информацию о графическом процессоре, предоставленную Google, с помощью этой команды:
!nvidia-smi
3. Исследование и подготовка данных
3.1 Загрузка данных
Чтобы загружать данные быстрее и эффективнее при обучении и оценке моей модели глубокого обучения, я буду использовать класс ImageDataGenerator в Keras. С помощью ImageDataGenerator наши изображения в наборах данных будут постепенно загружаться на этапе обучения и оценки. Поэтому нам не нужно заранее загружать все изображения в нашу системную память.
На основе кода, который вы видите с помощью ImageDataGenerator, мы можем применять любое преобразование и дополнение (изменение масштаба, сдвиг, масштабирование и т. д.) к нашим изображениям при их загрузке для обучения и оценки.
Кроме того, мы можем разделить наши данные на данные обучения и данные проверки, используя (подмножество) при загрузке набора данных.
Подробнее см. здесь: https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/ImageDataGenerator
3.2 Исследование данных
После запуска приведенного выше кода это вывод:
Found 2420 images belonging to 16 classes. Found 597 images belonging to 16 classes.
значит у нас есть 2420 изображений для обучения и 597 для проверки, все изображения относятся к 16 видам грибов.
Сначала я подумал, что у этих данных есть некоторые проблемы, кажется, что данные не сбалансированы, но после того, как я вижу, что гриб, который не был съедобным, имеет больше данных, так что это преимущество для моей модели, потому что я хочу, чтобы моя модель иметь ложноотрицательные грибы, которые не съедобны.
4. Построение модели
После того, как мы загрузим и изучим наши данные, наш следующий шаг — построить модель, которая сможет классифицировать гриб. Я буду использовать метод трансферного обучения, чтобы обучить модель, используя intercpetV3 в качестве базовой модели, и подключить ее, когда плотный слой будет классифицировать гриб.
Что такое трансферное обучение?
- Трансферное обучение — это метод, в котором мы используем предварительно обученные слои существующих нейронных сетей, которые выполняют задачу, аналогичную той, которую вы пытаетесь решить. Например, вы можете получить доступ к DNN, которая уже обучена классифицировать 1000 классов, включая животных, транспортные средства, растения и т. д. Назовем ее моделью А. И теперь вы хотите построить модель, которая классифицирует кошек и собак, тогда хорошей идеей будет использовать предварительно обученную модель А.
В чем преимущество трансферного обучения?
- Вы можете использовать уже обученные слои существующей модели.
- Требовать меньше данных для модели, чтобы обнаружить закономерность
- Ускорьте обучение, так как вы уменьшаете обучаемые параметры в каждом слое
4.1 Архитектура модели
На графике видно, что
- Я использую предварительно обученные слои модели inceptionV3.
- В строке (7-9) мы превращаем все слои предварительно обученной модели в необучаемые слои, что означает, что веса слоя не будут влиять на обратное распространение.
- Строка (13–20) Я поместил слой InceptionV3 в свою последовательную модель, которая подключается к скрытому слою с 64 нейронами с функцией активации relu, а затем подключается к выходному слою, который использует функцию активации softmax, потому что мы обучаем мультиклассовую модель классификации.
4.2 Обучение
Теперь модель готова, следующим шагом будет предоставление модели данных для обучения.
Чтобы избежать проблем с переоснащением и исчезающим градиентом, прежде чем мы обучим модель, рекомендуется определить функцию обратного вызова с ранней остановкой, что означает, что модель остановит процесс обучения, когда при его выполнении проверка больше не улучшается.
На основе этого кода модель будет проверять один раз в 5 эпох, если точность не улучшится хотя бы на 0,001, модель остановит обучение и сохранит последние лучшие веса модели в качестве весов.
Теперь давайте обучим модель
На самом деле, я тренировал модель дважды: сначала я тренировал ее только в течение 20 эпох, затем я тренировал ее еще в течение 10 эпох, теперь производительность модели кажется хорошей с точностью 0,94 для данных обучения и 0,80 для тестовых данных.
затем давайте сохраним модель для последующего использования:
model.save(path/to/save)
Что дальше?
- Проверить и протестировать модель
- Матрица производительности, AUC и ROC для выбора лучшего порога
- Квантование модели для использования в мобильном приложении