Я начинаю этот блог с простого вопроса:

  • Ты знаешь греческий алфавит?

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

Обрамление проблемы

Так что же это было за письмо, которое боялись и почитали? Это была буква xi. Ничто не пугало меня больше, чем необходимость писать это письмо во время лекции или по заданию. Для тех из вас, кто не знаком с этой буквой, она пишется как ξ, попробуйте написать ее самостоятельно и представьте, что вам придется сделать это 30 раз. Это похоже на правду? Мой точно нет.

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

Повестка дня

  1. Подготовка данных
  2. Создание наших сверточных нейронных сетей
  3. Окончательная оценка
  4. Окончательная оценка
  5. Ограничения и расширения
  6. Выводы

1. Подготовка данных

Данные, которые я использовал для этого проекта, являются подмножеством набора данных HASYv2, который содержит около 170 000 черно-белых изображений 32x32 рукописных математических знаков и символов, а также CSV-файл с путями изображений и связанными с ними математическими символами. Пожалуйста, обратитесь к ссылке 1 в конце этого блога для получения дополнительной информации об этом наборе данных. В этом наборе данных содержится все от ⟺ до ∞ и, что более важно, греческие буквы. Существует 31 520 изображений греческих букв, и некоторые примеры можно увидеть ниже.

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

Как мы на самом деле работаем с изображениями?

После загрузки наших изображений в нашу рабочую область и создания фрейма данных из нашего CSV-файла мы теперь можем начать работать с нашими изображениями. Но что именно это влечет за собой? Как компьютеры просматривают изображения и что требуется для их использования в нашем CNN. Для более глубокого понимания того, как компьютеры видят изображения, я настоятельно рекомендую этот сайт, но я дам простой обзор, достаточный для наших нужд. Компьютеры видят черно-белые изображения как единый массив, равный по размеру размерам изображения. Массив заполняется значениями от 0 до 255 включительно, где 0 соответствует черному пикселю, а 255 — белому пикселю. В нашем случае эти массивы будут иметь размер 32 x 32, и, к счастью для нас, в Keras есть функция img_to_array(), которая преобразует наши изображения в массивы. Чрезвычайно упрощенное преобразование показано ниже с изображением цифры 6 размером 8 x 8.

После того, как мы объединили все наши изображения в массивы, нам нужно выполнить некоторые дополнительные шаги по подготовке данных. Как и многие алгоритмы машинного обучения, нейронные сети работают намного лучше, когда значения нормализованы, поэтому мы разделим наши массивы на 255, чтобы их значения находились в диапазоне от 0 до 1. Еще один важный шаг, прежде чем мы сможем начать создавать нейронную сеть, — убедиться, что входной массив, созданный из наших изображений, имеет правильные размеры. Нашей сети потребуется 4D-ввод формы (x, 32, 32, 1), где x — количество различных изображений, которые мы передадим в модель. Этого легко добиться с помощью метода изменения формы NumPy. Целевые метки должны быть закодированы горячим способом, что было достигнуто с помощью функции Keras to_categorical(). Наконец, мы разделим наши данные на обучающие и тестовые наборы данных, используя стратифицированную выборку и размер теста 0,2. Теперь мы можем приступить к созданию нашей модели.

2. Построение сверточных нейронных сетей

Для построения нашей сверточной нейронной сети мы будем использовать Keras. Я не буду слишком углубляться во внутреннюю работу нейронной сети, так как я хотел бы, чтобы этот пост можно было усвоить за один присест, и существует множество фантастических ресурсов, таких как Серия нейронных сетей 3Blue1Browns, если вы незнакомы с ними. Я дам очень краткое интуитивное описание ключевых слоев, которые мы будем использовать в нашей исходной модели.

  1. Conv2D — это сверточная часть нашей сверточной нейронной сети. Этот слой будет сканировать изображение и пытаться зафиксировать пространственное соотношение пикселей, а также их интенсивность.
  2. MaxPooling2D — этот слой поможет выбрать только самые важные функции из выходных данных слоя Conv2D и, таким образом, уменьшить количество измерений функций.

Используя эти слои вместе со скрытым полносвязным слоем и полносвязным выходным слоем, мы можем создать нашу первую модель, модель 1. Эта модель показана ниже, и с помощью 5-кратной стратифицированной перекрестной проверки мы получили средний показатель точности: 82,74%.

Установив эту базовую производительность, мы можем начать добавлять слои в нашу сеть и изменять количество нейронов в каждом слое. После некоторых исследований и экспериментов я создал еще две модели, названные моделями 2 и 3. У них просто было больше слоев и разное количество нейронов, и их производительность продемонстрирована ниже. Полную информацию об их архитектуре можно найти в этом связанном проекте Рабочей тетради. Как видите, эти добавления слоев, безусловно, улучшили производительность моделей.

При работе с нейронными сетями следует опасаться переобучения. Все 3 модели, которые я создал, постоянно получали оценки точности обучения более 90%, что значительно выше, чем их производительность на данных проверки в перекрестной проверке.

Уменьшение переобучения

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

3. Окончательная оценка

С этими улучшенными результатами я решил выбрать модель 3 с отсевом в качестве моей окончательной модели и обучил ее, используя обучающие данные (80%), и проверил ее производительность. Модель получила окончательную оценку точности 90,26%. На этом этапе я настоятельно рекомендую просмотреть отчет о классификации тестовых прогнозов, так как это может дать более глубокое представление о том, как работает модель, а точнее, где именно она идет не так. Я включил его подраздел ниже.

Из этого отчета вы заметите, что некоторые классы классифицируются довольно хорошо, например, кси и бета, в то время как эпсилон и пси борются с отзывом. Классы, которые показывают хорошие результаты, чаще всего имеют особый дизайн букв, такой как Xi или бета, тогда как классы, испытывающие затруднения, часто имеют общие характеристики с другими буквами. Это подводит нас к одному из основных ограничений этого набора данных: некоторые изображения из разных классов могут казаться очень похожими. Ниже показан пример буквы эпсилон, варэпсилон и xi. Я бы сказал, что даже людям, знакомым с греческим алфавитом, будет сложно правильно классифицировать эти изображения.

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

4. «Окончательная» оценка

В последнем разделе мы выполнили формальную проверку производительности выбранной нами модели, но, имея в виду мою первоначальную мотивацию, я счел необходимым протестировать модель на собственном почерке. Именно это я и сделал, я создал 38 черно-белых изображений 32x32 моих собственных рукописных греческих букв и предсказал их класс, используя модель 3 с отсевом. На самом деле я создал связанную рабочую тетрадь, в которой точно описано, как вы можете сделать это самостоятельно, и я с нетерпением жду возможности увидеть, насколько хорош ваш почерк. Мои изображения показаны ниже:

Теперь момент истины, обобщает ли модель мой почерк? На моих изображениях модель правильно классифицировала 29/38 букв с точностью 76,3% и, что более важно, правильно классифицировала мои xi. Ошибки могут быть из-за моего почерка, что неудивительно, или из-за некоторых ограничений данных. Прежде чем закончить этот блог, мы быстро обсудим некоторые из этих ограничений.

5. Ограничения и расширения

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

Это плавно переходит в потенциальный метод улучшения нашей модели — увеличение данных. Это процесс применения различных преобразований, таких как вращение, увеличение, сдвиг, отражение и многих других дополнений для синтетического увеличения объема имеющихся у вас данных. У Keras есть способ не только загружать ваши изображения, но и выполнять их аугментации при передаче в выбранную вами модель, они известны как ImageDataGenerators. Для получения дополнительной информации о них я рекомендую обратиться либо к этой¹, либо к этой² статье. К сожалению, во время этого проекта у меня не было достаточно времени, чтобы полностью изучить этот подход, но я посвятил раздел в конце своей рабочей тетради настройке необходимой структуры и тестированию нашей модели с аугментацией. Я рекомендую либо настроить фреймворк самостоятельно, либо поиграть с моим, чтобы посмотреть, сможете ли вы улучшить полученные результаты.

6. Выводы

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

Чтобы увидеть полную книгу, пожалуйста, посетите мой репозиторий GitHub.

Ссылки

  1. Тома, Мартин. «Набор данных hasyv2. препринт arXiv arXiv:1701.08380 (2017)»
  2. Классификация цифр с использованием сверточных нейронных сетей
  3. Полное руководство по сверточным нейронным сетям — способ ELI5
  4. Как компьютеры видят изображение?

Этот проект был частью моего обучения работе с данными в Digital Futures. Digital Futures помогает людям любого происхождения начать свою карьеру в сфере технологий. Если вам нравится то, что мы делаем, присоединяйтесь к нам на digitalfutures.com.