Прежде чем читать эту статью, вы также должны прочитать мою первую статью здесь, потому что в моей первой статье я дал вам обзор моего проекта и мотивацию для этого проекта. Если вы уже прочитали часть 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 для выбора лучшего порога
  • Квантование модели для использования в мобильном приложении