Второй классификатор ?!

Звучит странно? Итак, это мой второй блог из серии DIY-моделей CNN. Проверить первый классификатор можно здесь. Если вы не читали мою предыдущую статью, я настоятельно рекомендую это сделать, так как я буду строить ее на ее основе. Формат этого блога останется прежним. Я дам вам файл Colab, который вы должны запустить (нет, если и нет), прежде чем продолжить.

Итак, поехали - Просто запустите! 🏃‍♀️

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

Человек-кошка ИЛИ человек-собака?

Набор данных «Кошки против собак» не входит в комплект поставки Keras. Он был предоставлен Kaggle в рамках конкурса компьютерного зрения еще в 2013 году. Тогда они смогли достичь точности 95%. Довольно круто, а?

В этой статье мы сосредоточимся на 3 различных моделях и способах достижения более высокой точности. Прохладный? Давайте начнем.

Модель 1 - Базовая модель

Результат: точность ~ 74%

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

Предварительная обработка данных

У вас есть изображения, но модели работают на матрицах! Верно! Итак, этот шаг потребуется практически во всех моделях на основе CNN. Большинство из этих вещей обсуждалось в прошлой статье, так что мы не будем их повторять. Так:

1. Загрузите изображения
2. Декодируйте содержимое JPEG в сетку пикселей RGB.
3. Измените размер изображения до 150 * 150 пикселей (чтобы уменьшить его размер).
4. Изменить масштаб значения пикселей (от 0 до 255) в интервале (0, 1] interval

Керас ImageDataGenerator

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

Работает с генераторами Python. Если вы не знакомы с этим, настоятельно рекомендую это сделать. Проще говоря, Генератор - это особый тип итератора, который работает лениво. В отличие от списков, они не хранят свое содержимое в памяти, а выдают его при необходимости. Итак, это итераторы, которые не блокируют вашу память, а используют ее при необходимости. Удивительные вещи, правда?

Сверточный слой ++

Кто-то скажет - нет, модель не такая, как раньше. Имеет еще 3 слоя свертки. Виновен по обвинению! Да, вы можете придумать причину?

Наш рукописный классификатор имел размер матрицы [28 * 28], тогда как здесь мы имеем дело с размером матрицы [150 * 150]. Итак, поскольку мы имеем дело с изображениями гораздо большего размера и с гораздо более сложной проблемой, мы склонны добавлять больше слоев. В первую очередь это делается для уменьшения размера ввода, пока он достигает слоя Flatten.

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

Модель 2 - Переобучение снасти

Результат: точность 84%

Если вы увидите результаты на графике выше - что вы об этом думаете? Это классический случай переобучения. Точность обучения линейно увеличивалась со временем, но точность тестирования остановилась на уровне ~ 70%. Давайте проанализируем несколько распространенных методик устранения переобучения.

Слой исключения

Это метод регуляризации, при котором случайно выбранные нейроны полностью игнорируются в процессе обучения. Они просто «выпадают» случайным образом. Итак, как только начинается обучение, модель начинает изучать специализированные функции на основе предоставленных данных. Может случиться так, что эти функции могут стать слишком специфичными для обучающих данных и могут полностью выйти из строя на тестовых данных. Итак, чтобы добавить один уровень случайности и сделать его более общим, используется этот метод.

Увеличение данных

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

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

Модель 3 - Предварительно обученные CNN

Результат: точность 94%

Зачем изобретать колесо ?! Если кто-то уже это сделал, зачем начинать с нуля? Это основная интуиция, лежащая в основе такого подхода.

Извлечение функций

Как мы упоминали ранее, самые эффективные сети - это те, которые были обучены на бесконечном количестве данных. Скажем, кто-то с большими полномочиями обучил сеть на ImageNet (этот набор данных содержит, скажем, миллионы изображений животных). Мы должны иметь возможность повторно использовать эту конкретную модель, обученную на многих животных, чтобы определить наш вариант использования кошек и собак.

Но обычно предлагается повторно использовать только сверточные слои, а не внутренние FC-слои. Основная причина в том, что ядра, изученные на сверточном уровне, могут быть немного общими и могут быть легко использованы повторно. Скажем, способность обнаруживать глаза и нос может быть легко повторно использована нашей системой.

Но веса, полученные на уровне FC, могут быть гораздо более специфичными для характера проблемы и могут не иметь большого значения для нашего конкретного варианта использования. Скажем, эти веса FC могут хорошо работать, когда нужно обнаружить 100 классов животных, но могут не работать, когда нужно обнаружить только 2 класса (согласно нашему варианту использования).

Тонкая настройка

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

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

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

Я надеюсь, что это дает вам хороший обзор идей, которые можно использовать для повышения точности сети CNN. На сегодня все, ребята!

Большая часть контента была вдохновлена ​​книгой Deep Learning with Python. Это книга в свободном доступе. Прочтите книгу, если у вас будет возможность.