В предыдущем посте мы кратко рассмотрели архитектуру EfficientNet-V2 и представили способ ее импорта в нашу среду. Теперь мы импортируем данные и продолжим их обучение в нашей сети.

Функция для импорта объекта модели

Прежде чем мы приступим к обучению модели, мы создадим функцию, которая возвращает объект модели.

Приведенный выше фрагмент кода сохраняется в файле с именем

model.py

В 25-й и 26-й строках кода мы устанавливаем все веса, кроме веса, в последних трех слоях в качестве обучаемых параметров («размораживание последних трех слоев»). Это снижает количество обучаемых параметров с 5 967 589 до 357 205, что составляет примерно 94% от количества параметров, которые нам нужно обучить! Это сокращает время, затрачиваемое на обучение нейронной сети, что значительно сокращает объем вычислений.

Код, используемый для обучения

Приведенный выше фрагмент кода используется для обучения сети. Объяснение кода выглядит следующим образом

  • В строке 12 модель EfficientNetV2 с разблокированными тремя последними слоями вызывается с помощью функции model_def() в файле model.py.
  • В строках с 19 по 22 мы устанавливаем шаг предварительной обработки, который должны пройти изображения, прежде чем они будут загружены в нейронную сеть. Значения пикселей повторно масштабируются до диапазона [0,1] и изменяются размеры, чтобы иметь высоту и ширину 224 пикселя. Мы будем использовать 10% изображений для проверки.
  • Со строк с 25 по 27 мы создаем набор данных, имея в виду, что 90% из них будут использоваться для обучения, а остальные — для проверки.
  • Учитывая, что нейронная сеть имеет возможность работать с числовыми значениями, 85 классов кодируются числами от 0 до 84 (меточное кодирование). Каждое число соответствует одному классу. Это сопоставление класса с номером хранится в файле JSON с именем class_mappings.json (строки с 30 по 34).
  • Для обучения модели на наших данных мы используем оптимизатор Адама, который использует адаптивную оценку моментов градиентов первого и второго порядка. Это помогает быстро найти оптимальное решение. После обучения нейронной сети мы хотели бы сохранить вновь полученные веса моделей для повторного использования в будущем. Для этого мы используем функцию обратного вызова, предоставляемую Keras. Затем эта функция обратного вызова вызывается в функции model.train(). Вес модели хранится в файле training_1/cp.ckpt. Вышеупомянутые шаги выполняются кодом с 49 по 60 строки.
  • Наконец, мы обучаем модель на 25 эпох. Эпоха наступает, когда нейронная сеть проходит через все обучающие данные один раз. (строка 62)

Учебный процесс

Прежде чем мы продолжим процесс обучения, я хочу еще раз просмотреть файл model.py, который мы создали для инициализации нашей модели EfficientNet-V2.

В приведенном выше коде мы «разморозили» последние три слоя. Это можно изменить, изменив строку 25.

Обучение нейронной сети путем итеративной разморозки слоев

Шаг 1: Чтобы обучить сеть, мы сначала разморозим последний слой и запустим процесс обучения на 25 эпох.

Шаг 2: Затем мы размораживаем предпоследний слой и последний слой и загружаем вес, который мы получили на шаге 1.

Шаг 3: С новыми весами сети и разморозкой последних двух слоев снова обучите сеть в течение 25 эпох.

Шаг 4: Загрузите веса, полученные на шаге 3, в сеть и разморозьте последние три слоя.

Шаг 5: Снова обучите сеть на 25 эпох и сохраните веса.

Точность обучения составляет ~ 91%, а точность проверки — ~ 87,5%. Мы можем увеличить это, разморозив больше слоев.

Как классификатор работает в 85 классах?

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

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

Похоже, что продукты питания, похожие по цвету, чаще классифицируются неправильно.

Например, продукты питания дабл ка митха, идли, питха похожи по цвету, хотя это совершенно разные продукты питания.

Следующие шаги

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

Следующую статью можно найти здесь.