В этом уроке мы создадим сеть для предсказания класса изображения. Поэтому мы используем набор данных tf_flowers, который состоит из 3670 и 5 различных классов. Этот туториал основан на туториале от TensorFlow.

Этот урок следует нашему известному рабочему процессу:

  1. Загрузка данных и подготовка наших наборов данных
  2. Определить модель
  3. Обучение и оценка модели

Загрузка данных и подготовка наших наборов данных

Во-первых, давайте посмотрим на наш набор данных. Мы используем набор данных tf_flowers, предоставленный библиотекой наборов данных TensorFlow (tfds).

Поэтому мы загружаем набор данных в нашу функцию get_dataset() с помощью tfds. После этого мы применяем функцию предварительной обработки к каждому образцу в наборе данных и генерируем пакет размером один.

В функции main() мы отображаем первые 9 изображений в наборе данных. Результат должен быть примерно таким:

В нашем наборе данных есть несколько проблем:

  1. разные размеры изображений,
  2. диапазон пикселей от 0 до 255 (мы предпочитаем их от 0 до 1), и
  3. кодирование меток изображений.

Чтобы решить эти проблемы, мы применяем изменение размера изображений, стандартизируем их, разделив на 255, и кодируем метки с помощью функции one-hot(). Горячее кодирование означает, что вместо одного скалярного значения мы представляем наши классы векторами. Каждая строка в векторе представляет один класс. Мы хотим классифицировать 5 классов, поэтому метка 4 становится [0 0 0 1 0]. Кроме того, мы разделяем данные на обучающие и тестовые данные и перемешиваем их.

Это оставляет нам следующий вывод:

Определите модель

Как и в предыдущих руководствах, мы определяем нашу модель как класс и наследуем от tf.keras.Model. Мы определяем 3 сверточных слоя, каждый с максимальным объединяющим слоем, затем сглаживающим слоем и плотным слоем.

Мы комбинируем и обучаем модель, используя наши trainer_cnn.py и main.py(см. Приложение):

Как видите, в первую очередь повышается точность обучения и валидации. Через пару эпох точность больше не растет, а начинает падать.

Этот эффект возникает из-за переобучения. Каждую эпоху модель обучается, используя все доступные точки данных. Через несколько эпох модель запоминает данные обучения. Мы можем увеличить наши данные, чтобы решить эту проблему: мы используем наши существующие изображения и создаем новые изображения, масштабируя или поворачивая изображения.

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

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

Приложение

Тренер получает модель и набор данных, обучает модель и распечатывает выходные данные.

Нам также нужно немного изменить наш main.py, чтобы иметь возможность устанавливать ширину и высоту изображения и размер пакета:

Что мы узнали:

  • Крайне важно подготовить наш набор данных (те же размеры, стандартизированные и перетасованные)
  • Кроме того, нам нужно увеличивать изображения, если у нас недостаточно данных (у нас никогда не бывает достаточно данных ;-))
  • Dropout Layer помогает!

Что можно сделать дополнительно:

  • Измените количество функций, добавьте/удалите слой CNN.
  • Используйте линейную функцию активации для выходного нейрона и функцию потерь SparseCategoricalCrossentropy