Архитектура вашей модели, вероятно, в порядке. Качество данных отстой.

В предыдущей статье вы видели, как обучить базовый классификатор изображений с помощью сверточных сетей. Мы получили около 75% точности без особых усилий — только за счет использования двух сверточных слоев и двух объединяющих слоев, за которыми следует полносвязный слой.

Это лучшее, что мы можем сделать? Стоит ли добавлять больше слоев? Когда модель становится слишком сложной и что тогда происходит? На эти вопросы вы найдете ответы в сегодняшней статье. Мы добавим несколько блоков свертки, чтобы увидеть, сколько может обрабатывать наш набор данных о собаках и кошках.

Не хочется читать? Лучше посмотрите мое видео:

Вы можете скачать исходный код на GitHub.

Используемый набор данных и предварительная обработка данных

Мы будем использовать набор данных Dogs vs. Cats от Kaggle. Он находится под лицензией Creative Commons License, что означает, что вы можете использовать его бесплатно:

Набор данных довольно большой — 25 000 изображений, равномерно распределенных между классами (12 500 изображений собак и 12 500 изображений кошек). Он должен быть достаточно большим, чтобы обучить достойный классификатор изображений. Единственная проблема — он изначально не структурирован для глубокого обучения. Вы можете следовать моей предыдущей статье, чтобы создать правильную структуру каталогов и разделить ее на наборы для обучения, тестирования и проверки:



Вам также следует удалить изображения train/cat/666.jpg и train/dog/11702.jpg, так как они повреждены, и ваша модель не сможет тренироваться с ними. .

Далее давайте посмотрим, как загружать изображения с помощью TensorFlow.

Как загрузить данные изображения с помощью TensorFlow

В моделях, которые вы увидите сегодня, будет больше слоев, чем в предыдущих статьях. Для удобочитаемости мы будем импортировать отдельные классы из TensorFlow. Убедитесь, что у вас есть система с графическим процессором, если вы следуете за ней, или хотя бы используйте Google Colab.

Давайте избавимся от импорта библиотеки:

Это много, но из-за этого модели будут выглядеть особенно чистыми.

Теперь мы загрузим данные изображения, как обычно — с классом ImageDataGenerator. Мы преобразуем матрицы изображений в диапазон 0–1 и изменим размер всех изображений до 224x224 с тремя цветовыми каналами. Из соображений памяти мы уменьшим размер пакета до 32:

Вот результат, который вы должны увидеть:

Это все, что нам нужно — давайте взломаем первую модель!

Имеет ли значение добавление слоев в модель TensorFlow?

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

Сегодня все сводится к пониманию того, почему не стоит развивать модельную архитектуру. Мы получили точность 75% с довольно простой моделью, так что это базовый уровень, который мы должны превзойти:



Модель 1 — Два сверточных блока

Мы объявим первую модель чем-то напоминающей архитектуру VGG — два сверточных слоя, за которыми следует слой пула. Не будем сходить с ума от количества фильтров — 32 для первого и 64 для второго блока.

Что касается потери и оптимизатора, мы будем придерживаться основ — категориальной кросс-энтропии и Адама. Классы в наборе данных идеально сбалансированы, а это значит, что мы можем обойтись только отслеживанием точности:

Вот результаты обучения после 10 эпох:

Похоже, мы не превзошли базовый уровень, поскольку точность проверки по-прежнему составляет около 75%. Что произойдет, если мы добавим еще один сверточный блок?

Модель 2 — Три сверточных блока

Мы сохраним архитектуру модели идентичной, единственное отличие — дополнительный сверточный блок со 128 фильтрами:

Вот журнал:

Угу. Модель полностью застряла. Вы можете поиграться с размером пакета и скоростью обучения, но, скорее всего, вы не продвинетесь далеко. Первая архитектура лучше работала с нашим набором данных, поэтому давайте попробуем немного ее настроить.

Модель 3 — Два сверточных блока с отсевом

Архитектура третьей модели идентична первой, отличие только в дополнительном полносвязном слое и выпадающем слое. Посмотрим, есть ли разница:

Вот журнал тренировок:

Ужасно, у нас сейчас меньше 70%!. Вот что бывает, когда фокусируешься не на том. Простая архитектура из предыдущей статьи вполне устраивала. Это проблема качества данных, которая ограничивает прогностическую силу вашей модели.

Заключение

И вот оно — доказательство того, что более сложная архитектура модели не обязательно приводит к более эффективной модели. Возможно, вы могли бы найти архитектуру, которая лучше подходит для набора данных собак и кошек, но это, скорее всего, погоня за дикими гусями.

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

Следите за новостями в следующих статьях, так как обе они необходимы современному специалисту по обработке и анализу данных.

Понравилась статья? Станьте участником Medium, чтобы продолжать обучение без ограничений. Я получу часть вашего членского взноса, если вы перейдете по следующей ссылке, без каких-либо дополнительных затрат с вашей стороны.



Оставайся на связи

  • Подпишитесь на мою рассылку"
  • Подпишитесь на Ютуб
  • Подключиться в LinkedIn