Я начну этот пост с одной из моих любимых сцен из Кремниевой долины:

Когда вышел этот эпизод, я был довольно далек от мира Data Science. Я подумал, что это весело и умно, но я даже не задумывался о технических тонкостях того, как Цзянь Ян мог определить, было ли его фото хот-догом или нет.

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

Этот пост будет в основном письменной версией нашего выступления. Я расскажу, как изображения хранятся в форматах данных, дам общее представление о нейронных сетях, расскажу, как реализовать сверточную нейронную сеть для обработки изображений, и все это при использовании нашего примера «Хот-дог или не хот-дог». Готовый?

Как изображения хранятся в форматах данных

Изображения, как и все данные, на самом деле просто разбиты на группы чисел. Вместо того чтобы думать обо всем изображении как о «одном фрагменте данных», представьте, что каждый пиксель изображения представляет собой число от 0 до 255. Это число зависит от того, насколько цвет пикселя влияет на изображение. Затем, когда у вас есть все изображение (скажем, 120x120 пикселей), у вас есть матрица данных 120x120, например:

Это черно-белое фото. Видите, как супер-черные пиксели равны 255, а все пробелы - нули?

То же самое и с цветными фотографиями, но на этот раз у вас есть три слоя друг над другом - красный, зеленый и синий. Каждый пиксель по-прежнему представляет собой число от 0 до 255. Теперь у вас есть матрица 120x120x3:

А вот мои слои RGB для фотографии хот-дога:

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

Введение в нейронные сети

Теперь, когда мы знаем, как изображения хранятся в форматах данных, мы можем понять, как они обрабатываются и передаются в нейронные сети.

Нейронные сети названы так, потому что они параллельны архитектуре реального биологического мозга. Сеть основана на простой форме входов и выходов. Давайте подумаем о том, как биологические нейронные сети в человеческом мозге обрабатывают информацию.

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

Нейронная сеть состоит из множества нейронов, связанных друг с другом через то, что мы называем «скрытыми слоями». Давайте посмотрим на архитектуру того, как может выглядеть наша нейронная сеть Hot Dog:

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

Давайте поместим это в контекст, используя наш собственный мозг. Допустим, я иду по улице и вижу эту штуку: 1) у нее четыре ноги, 2) есть хвост, 3) она лает, 4) очень пушистая и 5) очень милая. Это наши пять функций, которыми мы будем кормить входной слой нашего мозга. Мой мозг сделает всю работу по объединению этих функций. При приближении к одному нейрону в одном скрытом слое он мог думать: «Четыре ноги и хвост! Может быть, лошадь ». И еще один нейрон: «Супер пушистый и очень милый! Может быть плюшевая игрушка Пушин! ». Мой мозг делал это снова и снова для всех функций на скрытом слое, чтобы затем решить, что это собака.

Для изображения хот-дога каждая функция - это номер. Помните ту матрицу 120x120x3? Это 43 200 чисел, которые он принимает. Скрытый слой определяет края, цветовые группы и многое другое. Например, если он видит длинный кластер хлебных цветов между длинным кластером мясных цветов, выходной слой может решить, что это хот-дог.

Пример с хот-догом является двоичным, что означает, что есть только два выхода. Либо хот-дог, либо нет. Это то, что действительно разочаровало остальную команду Кремниевой долины, потому что они хотели, чтобы приложение могло обнаруживать * любой * тип еды. Для этого потребуется мультиклассовая нейронная сеть, где выходной слой будет состоять из миллионов различных типов еды.

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

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

Сверточные нейронные сети

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

Этот процесс по сути превращает эту фотографию:

В другое изображение, разбитое на плитки одинакового размера:

А затем мы можем снова передать каждую крошечную плитку изображения в сеть. Этот шаг существенно снижает размерность исходного изображения. Чтобы снова его уменьшить, мы вводим метод под названием «Max Pooling», который, по сути, берет весь массив и сохраняет только самые важные функции (то есть наибольшее число). Итак, мы начали с одного гигантского изображения и продолжали разбивать его, чтобы получить небольшой (er) массив, который мы, наконец, можем вернуть обратно в нашу полностью подключенную нейронную сеть.

Это была масса информации! Для более подробного объяснения сверточных нейронных сетей, максимального объединения и понижающей дискретизации я настоятельно рекомендую этот пост Medium (где я получил изображения ребенка). Это было так полезно в нашем исследовательском процессе!

Полученные результаты

После того, как мы возились с несколькими сверточными слоями, выпадающей регуляризацией, тестировали различные гиперпараметры и ждали много-много эпох, мы достигли показателей точности от 70% до 74%. Это было просто * хорошо *, учитывая, что у нас был (целенаправленный!) Классовый дисбаланс.

Трансферное обучение

В конце концов, мы получили лучшие результаты, применив метод под названием Transfer Learning. Это повторное использование предварительно обученной модели, а свою мы получили через Керас. В этом случае эти модели трансферного обучения предварительно обучаются на миллионах изображений для тысяч классов. Вишал протестировал несколько предварительно обученных моделей (VGG16, InceptionV3 и MobileNetV2), а затем настроил их для адаптации к нашей бинарной классификации хот-догов.

С моделями трансферного обучения наши показатели точности превысили 90%, и почти все изображения, на которых мы их тестировали, были правильными.

Тестирование, тестирование!

При этом со 100% уверенностью догадались, что это изображение хот-дог. И это!

Я хот-дог?

Этот сэндвич - хот-дог?

Мы снова и снова пытались «сломать» нашу модель. Во время нашего разговора мы попросили взять предложения по живому изображению, и кто-то так умно попросил нас протестировать эклер!

Наша модель почти со 100% уверенностью догадалась, что этот эклер - хот-дог! Это эклер, очень похожий на хот-дог. Но все же не хот-дог.

Этот процесс был для нас таким удивительным процессом обучения и опыта. Целью этого поста было поделиться некоторыми знаниями, которые мы приобрели в процессе. В следующий раз, когда Facebook автоматически пометит ваши фотографии или ваш iPhone сгруппирует ваши фотографии по людям или событиям, я надеюсь, что вы лучше понимаете, как это делается!