В этом уроке мы создадим сеть для предсказания класса изображения. Поэтому мы используем набор данных tf_flowers, который состоит из 3670 и 5 различных классов. Этот туториал основан на туториале от TensorFlow.
Этот урок следует нашему известному рабочему процессу:
- Загрузка данных и подготовка наших наборов данных
- Определить модель
- Обучение и оценка модели
Загрузка данных и подготовка наших наборов данных
Во-первых, давайте посмотрим на наш набор данных. Мы используем набор данных tf_flowers, предоставленный библиотекой наборов данных TensorFlow (tfds).
Поэтому мы загружаем набор данных в нашу функцию get_dataset() с помощью tfds. После этого мы применяем функцию предварительной обработки к каждому образцу в наборе данных и генерируем пакет размером один.
В функции main() мы отображаем первые 9 изображений в наборе данных. Результат должен быть примерно таким:
В нашем наборе данных есть несколько проблем:
- разные размеры изображений,
- диапазон пикселей от 0 до 255 (мы предпочитаем их от 0 до 1), и
- кодирование меток изображений.
Чтобы решить эти проблемы, мы применяем изменение размера изображений, стандартизируем их, разделив на 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