Меня как любителя домашних животных привлекла задача от Kaggle узнать, является ли животное на картинке кошкой или собакой. Задача Собаки против кошек предоставляет набор данных о фотографиях кошек и собак. Затем в этой проблеме распознавания изображений участников просят построить алгоритм для классификации, содержат ли изображения из неклассифицированных тестовых данных собаку или кошку. Хотя эту задачу легко решить человеческими глазами, компьютерам сложно ее классифицировать. В этом отчете я изучу данные из Kaggle, обучу и сравню несколько моделей машинного обучения и в конце объясню, почему я выбираю окончательную модель.

Набор данных:

Я извлек набор данных о собаках и кошках из Kaggle с двумя zip-файлами: «train.zip» и «test1.zip».

«train.zip» относится к обучающим данным, которые содержат изображения собак/кошек, идентификаторы изображений и метки — на изображении изображена собака или кошка. Например, изображение кошки в обучающих данных может иметь имя «cat.1024.jpg», как показано ниже.

«test1.zip» относится к данным тестирования, которые содержат изображения собак/кошек, идентификаторы изображений, но не ярлыки, и используется для тестирования моделей и отправки на вызов Kaggle. Например, изображение кошки в тестовом наборе данных может иметь имя «1024.jpg», как показано ниже.

Сбор данных

Вот несколько случайных фотографий собак из набора данных собаки против кошек:

А вот несколько случайных фотографий кошек из набора данных dogs-vs-cat:

В коде собаки закодированы как 1, а кошки — как 0. Вот пример фрейма данных:

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

Из 25 000 записей данных в обучающем наборе данных у нас есть 125 000 кошек и 125 000 собак, как показано на рисунке ниже.

Мы выбираем 25% изображений (около 25000 * 0,25 = 6250 изображений) для проверки (в качестве тестового набора данных для нашей модели). Поскольку размеры изображений в исходных данных различаются, мы создаем экземпляр ImageDataGenerator, который будет масштабировать значения пикселей изображений, которые в дальнейшем будут вписываться в модели, обсуждаемые ниже.

Модели

Модель 1: Модель нейронной сети с одним слоем свертки

Первый слой свертки — комбинация слоев Conv2D и MaxPool2D с функцией активации Rectified Linear Unit (relu). Затем мы сглаживаем массив и создаем скрытый слой Dense со 128 единицами и используем Rectified Linear Unit (relu) в качестве функции активации. Самая последняя часть — это выходной слой, который содержит значение 0 или 1, где 0 представляет кошку, а 1 — собаку. Скорость обучения оптимизатора составляет 0,001.

Оценивая модель, мы имеем убыток 0,6886 и точность 0,5369. На рисунках ниже показаны различия в точности и потерях между обучающими и проверочными наборами. На первом рисунке точность обучения и точность проверки увеличиваются вместе примерно до 0,66 в 3-й эпохе. И после этого точность проверки относительно низкая по сравнению с точностью обучения. На втором рисунке потери при обучении и при проверке уменьшаются вместе примерно до 0,61 в 3-й эпохе. После 3-й эпохи потери при обучении относительно ниже, чем потери при проверке.

Таким образом, на картинке кажется, что Модель 1 переобучила набор обучающих данных примерно на 3-й эпохе.

Модель 2: Модель нейронной сети с двумя слоями свертки

Модель с двумя слоями свертки расширяет модель 1, добавляя один дополнительный слой свертки с 64 фильтрами.

Оценивая модель, мы имеем потерю при тестировании 0,5528 и точность тестирования 0,7189. На рисунках ниже показаны различия в точности и потерях между обучающими и проверочными наборами. На первом рисунке точность обучения и точность проверки увеличиваются вместе примерно до 0,71–0,73 в последнюю эпоху. На втором рисунке потери при обучении и при проверке уменьшаются вместе примерно до 0,53–0,55 в последнюю эпоху.

Модель 3: Модель нейронной сети с тремя слоями свертки

Эта модель с тремя слоями свертки расширяет модель 2, добавляя один дополнительный слой свертки со 128 фильтрами.

Оценивая модель, мы имеем потерю при тестировании 0,5655 и точность тестирования 0,7076. На рисунках ниже показаны различия в точности и потерях между обучающими и проверочными наборами. На первом рисунке точность обучения и точность проверки увеличиваются вместе примерно до 0,70 в последнюю эпоху. На втором рисунке потери при обучении и при проверке уменьшаются вместе примерно до 0,55 в последнюю эпоху.

Упрощение модели (регуляризация отсева)

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

Упрощенная модель расширяет модель 1, добавляя регуляризацию отсева. В этой модели коэффициент отсева 20% применяется после слоя свертки, а коэффициент отсева 50% применяется после полносвязного слоя в части модели классификатора.

Оценивая модель, мы имеем потерю при тестировании 0,7107 и точность тестирования 0,5146. На рисунках ниже показаны различия в точности и потерях между обучающими и проверочными наборами. На первом рисунке точность обучения и точность проверки увеличиваются вместе примерно до 0,66 в последнюю эпоху. На втором рисунке потери при обучении и при проверке уменьшаются вместе примерно до 0,61 в последнюю эпоху.

График для модели 1 без регуляризации отсева показан ниже, что включает переобучение после эпохи 3.

Таким образом, сравнивая производительность модели 1 с регуляризацией отсева и без нее, мы можем сказать, что общая точность не сильно улучшается, но переобучение уменьшается или задерживается.

Обсуждение

Для трех моделей с разным количеством слоев свертки (комбинация слоев Conv2D и MaxPool2D) точность моделей следующая:

  • Модель 1 имеет точность 0,5369 (один слой свертки).
  • Модель 2 с точностью 0,7189 (два сверточных слоя).
  • Модель 3 имеет точность 0,7076 (три сверточных слоя).
  • Модель 1 с регуляризацией отсева имеет точность 0,5164 (один слой свертки).

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

Кроме того, добавление регуляризации отсева в модель 1 не сильно увеличивает точность. Однако очевидное поведение переобучения после эпохи 3 для модели 1 было в значительной степени уменьшено или отсрочено. Для дальнейшего исследования и оптимизации можно рассмотреть более высокую скорость отсева после слоя свертки.

Чтобы сделать модель наиболее точной, я выбираю модель 3 в качестве окончательной модели. Для дальнейших проблем переобучения можно использовать регуляризацию отсева или увеличение изображения.

Репозиторий на гитхабе:

https://github.com/Yinghui-HE/Dogs-vs-Cats