Содержание статьи
Распознавание изображений на Python с помощью TensorFlow и Keras
Функции активации
Конечные слои CNN представляют собой плотно связанные слои или искусственную нейронную сеть (Artificial neural networks (ANN)). Основной функцией ANN является анализ входных признаков и объединение их в различные атрибуты, которые помогут в классификации. Эти слои образуют наборы нейронов, которые представляют различные части рассматриваемого объекта, а набор нейронов может представлять собой, например, висячие уши собаки или красноту яблока. Когда достаточное количество этих нейронов активируется в ответ на входное изображение, то оно будет классифицировано как объект. Ошибка или разница между рассчитанными значениями и ожидаемым значением в обучающем наборе рассчитывается с помощью ANN. Затем сеть подвергается методу обратного распространения ошибки, где рассчитывается влияние данного нейрона на нейрон в следующем слое и затем его влияние (вес) корректируется. Это сделано для оптимизации производительности модели. Этот процесс повторяется снова и снова: так сеть обучается на данных и изучает связи между входными признаками и выходными классами. Нейроны в средних полностью связанных слоях будут выводить двоичные значения, относящиеся к возможным классам. Если у вас есть четыре разных класса (скажем, собака, машина, дом и человек), нейрон будет иметь значение «1» для класса, который, как он считает, представляет изображение, и значение «0» для других классов. Конечный полностью связанный слой, получив выходные данные предыдущего слоя, присваивает вероятность каждому из классов в пределах единицы (в совокупности). Если категории «собака» присвоено значение 0,75 — это означает 75% вероятность того, что изображение является собакой.
Первый слой нашей модели — это сверточный слой. Он будет принимать входные данные и пропускать их через сверточные фильтры. При реализации этого в Keras, мы должны указать количество каналов (фильтров), которое нам нужно (а это 32), размер фильтра (3 x 3 в нашем случае), форму входа (при создании первого слоя), функцию активации и отступы. Как уже упоминалось, relu является наиболее распространенной функцией активации, а отступы мы определим через padding = ‘same’, то есть, мы не меняем размер изображения:
Создание модели нейронной сети включает выбор различных параметров и гиперпараметров. Вы должны принять решение о количестве слоев, используемых в вашей модели, о том, каким будет размер входных и выходных слоев, какие функции активации вы будете использовать, будете ли вы использовать исключение (Dropout) и т. д. Понимание того, какие параметры и гиперпараметры стоит использовать, придет со временем (изучать придётся много), но существуют некоторые базовые методы, которые вы можете использовать на старте, и мы рассмотрим некоторые из них в нашем примере.
Мы достигли стадии проектирования модели CNN. Первое, что нужно сделать, это определить формат, который мы хотели бы использовать для модели. У Keras есть несколько различных форматов (планов) для построения моделей, но наиболее часто используется Sequential — поэтому мы импортировали его из Keras.
Но нейронные сети — все же не человеческий мозг. Мозг сложнее, объемнее, в нем намного больше нейронов, чем в любой компьютерной нейросети. Поэтому чрезмерное обучение может сделать хуже. Например, переобученная нейросеть может начать распознавать предметы там, где их нет — так люди иногда видят лица в фарах машин и принимают пакеты за котов. А в случае с искусственной нейронной сетью такой эффект еще явнее и заметнее. Если же учить нейросеть на нескольких разнородных данных, скажем, сначала обучить считать числа, а потом — распознавать лица, она просто сломается и начнет работать непредсказуемо. Для таких задач нужны разные нейросети, разные структуры и связи.
Прежде чем мы перейдем к примеру обучения классификатора изображений, давайте уделим немного времени пониманию рабочего процесса или “конвейера” машинного обучения. Процесс обучения модели нейронной сети является довольно стандартным и может быть поделен на четыре различных этапа. Классификатор изображений теперь обучен и изображения могут быть переданы в CNN, которая теперь выведет предположение о содержании этого изображения.
Создание модели
Распознавание изображения относится к задаче ввода изображения в нейронную сеть и присвоения какой-либо метки для этого изображения. Метка, которую выводит сеть, будет соответствовать заранее определенному классу. Может быть присвоено как сразу несколько классов, так и только один. Если существует всего только один класс, обычно применяется термин «распознавание», тогда как задача распознавания нескольких классов часто называется «классификацией». Подмножество классификаций изображений — является уже определением объектов, когда определенные экземпляры объектов идентифицируются как принадлежащие к определенному классу, например, животные, автомобили или люди. Ярким примером такой классификации является решение самой распространённой капчи — ReCaptcha v2 от Google, где из набора картинок необходимо выбрать только те, которые принадлежат к указанному в описании классу.
Другие методы и формулы. Чтобы нейроны обучались, нужно задать формулу корректировки весов — мы говорили про это выше. Если нейронов много, то формулу нужно как-то распространить на все из них. Для этого используется метод градиентного спуска: рассчитывается градиент по весам, а потом от него делается шаг в меньшую сторону. Звучит сложно, но на самом деле для этого есть специальные формулы и функции.
Давайте поймем почему формула имеет такой вид. Сначала нам нужно учесть то, что мы хотим скорректировать вес пропорционально размеру ошибки. Далее ошибка умножается на значение, поданное на вход нейрона, что, в нашем случае, 0 или 1. Если на вход был подан 0, то вес не корректируется. И в конце выражение умножается на градиент сигмоиды. Разберемся в последнем шаге по порядку:
Для решения капч в беспрерывном режиме, с высокой скоростью и сравнительно низкой стоимостью — большим спросом пользуются онлайн сервисы по распознаванию капч, которые привлекают для этого реальных пользователей. На отечественном рынке лидером является сервис RuCaptcha.com, который выгодно отличается от конкурентов:
высокой точностью (до 99%) и скоростью решений (12 секунд для обычных текстовых капч и 24 секунды для ReCaptcha)
приемлемыми фиксированными ценами (цена не возрастает при увеличении нагрузки на сервера сервиса): 35 рублей за 1000 решений обычных капч и 160 рублей за 1000 решений ReCaptcha
возвратом средств за редкие неуспешные распознавания
технической возможностью решать огромные объёмы капч (более 10,000 в минуту)
простым и функциональным API
готовыми библиотеками и образцами кода для различных языков программирования
* привлекательной партнёрской программой, позволяющей разработчикам и рефоводам получать до 15% от расходов привлечённых клиентов и 10% от доходов привлеченных в сервис работников.
Обратите внимание, что в большинстве случаев вам нужно иметь проверочный набор, отличный от набора для тестирования, поэтому вы должны указать процент данных обучения, которые будут использоваться в качестве набора для проверки. В этом случае мы просто передадим тестовые данные, чтобы убедиться, что тестовые данные отложены и не использовались для обучения. В этом примере мы будем иметь только тестовые данные, чтобы все было проще. Теперь мы можем оценить модель и посмотреть, как она работает. Просто вызовите model.evaluate():
Существует несколько шагов для оценки модели. Первым шагом является сравнение производительности модели с набором проверочных данных: тех данных, на которых модель не была обучена. Таким образом, вы проверите работу модели с этим новым набором данных и проанализируете её эффективность с помощью различных показателей. Существуют различные метрики для определения производительности модели нейронной сети, но наиболее распространенной является «точность», то есть количество правильно классифицированных изображений, делённое на общее количество изображений в вашем наборе данных. После того, как вы увидите точность модели в проверочном наборе данных, вы, вероятно, снова вернетесь и до-обучите сеть, используя слегка подправленные параметры, поскольку вряд ли будете удовлетворены эффективностью своей сети при первой тренировке. Вы будете продолжать настраивать параметры своей сети, повторно обучать ее и измерять эффективность, пока не будете удовлетворены точностью сети. Наконец, вы проверите эффективность сети на тестовом наборе. Это еще один набор данных, который ваша модель никогда не видела раньше. Возможно, вам интересно: зачем нужен ещё один тестовый набор данных? Ведь вы уже получили представление о точности вашей модели, разве не это было целью “проверочного набора”? Всё дело в том, что все изменения параметров, которые вы производили, донастраивая сеть при работе с “проверочным набором данных” в сочетании с многократным повторным тестированием этого набора — могли привести к тому, что ваша сеть изучила некоторые особенности набора, но при этом она не будет так же хорошо обобщать данные вне выборки. Именно поэтому следует предоставить сети абсолютно новые тестовые данные. Цель тестового набора — проверить наличие проблем, таких как переобучение, чтобы быть более уверенными в том, что ваша модель действительно пригодна для работы в реальном мире.