Реализация предиктора изображения в слово в R.

Я давно не вносил свой вклад в сообщество. Я вернулся, чтобы отдать должное. Но перед этим позвольте мне рассказать вам, чем я занимался все это время. Ключевыми моментами всех этих месяцев в профессиональном плане стали две вещи. Во-первых, я выступал на конференции по науке о данных в марте (издание WiDS в Мумбаи). Во-вторых, я стал участником открытого исходного кода и получил запрос на перенос, объединенный в пакет numpy. Ура!

Хорошо, давайте начнем с машинного обучения. Я кратко расскажу о процессе моделирования и укажу вам на репозиторий github, в котором размещены все файлы и коды для их реализации.

Задача

Создайте модель для определения 5-буквенных английских слов из текстовых изображений. Эти слова созданы с использованием букв из набора данных EMNIST, который представляет собой набор рукописных цифр символов, преобразованных в формат изображения 28x28 пикселей и структуру набора данных, которая напрямую соответствует набору данных MNIST. Подробнее об этом можно узнать здесь.

Решение

Для решения этой проблемы построим две модели.

  1. Модель изображения. Предиктор слов, который берет изображение и угадывает, что на нем написано, путем распознавания изображения с помощью многослойного перцептрона.
  2. Текстовая модель: это будет дополнять модель изображения. Задача этой модели будет заключаться в том, чтобы выдать вероятность следующего символа на основе предыдущего символа, используя скрытую марковскую модель. Например, какова будет вероятность появления e после буквы n, a или x.

Шаги

Пожалуйста, обратитесь к этому репозиторию git, чтобы выполнить следующие шаги:



1. Загрузите набор данных с сайта EMNIST:

  1. Прокрутите вниз и нажмите «Набор данных формата Matlab».
  2. Будет загружен файл «Matlab.zip». Разархивируйте его, и вы найдете 6 наборов данных MS Access. Мы используем набор данных emnist-byclass для этой задачи, потому что в нем есть все символы
  3. Прочтите этот набор данных в R в первый раз, используя библиотеку «R.matlab»
  4. После загрузки сохраните набор данных в формате R (Rdata) для дальнейшего использования.

Набор данных EMNIST содержит 697 932 помеченных изображения размером 28 x 28 в обучающем наборе и 116 323 помеченных изображения в тестовом наборе. Изображения представлены в оттенках серого, где значение каждого пикселя от 0 до 255 представляет уровень темноты.

Набор для тестирования: загрузите файл ‘emnist words.Rdata’ из репозитория github. Файл содержит примеры из 1000 слов длиной 5. Этот тестовый набор был создан с использованием буквенных изображений из набора данных EMNIST. Переменная X содержит изображения слов, переменная y содержит истинные слова (метки), а переменная y_hat содержит прогнозы двухуровневой нейронной сети в сочетании с марковской моделью 2-го порядка.

Формат набора данных для прогнозирования: нам нужно получить необработанные входные данные в определенном формате перед вызовом функции прогнозирования. Входной X, который принимает функция прогнозирования, имеет размер 28n x 28L, где n - количество входных выборок, а L - длина слов (например, для 100 слов длиной 5, X будет размером 2800 x 140). Функция предиктора определена в файле ‘Word_Predictor_Champ.R’.

2. Загрузите файлы поддержки с github:

‘EMNIST_general_functions.R’- Этот файл содержит вспомогательные функции, позволяющие получить доступ к набору данных EMNIST, вычислить ошибку, создать новые слова с использованием набора данных EMNIST.

‘EMNIST_run.R’- Это файл выполнения кода. Поместите все файлы из репозитория github в выбранный вами каталог и запустите файл «EMNIST_run.R». Это выдаст точность символа и точность слова для оценки модели.

3. Постройте модели:

Файл «Code_image_text.R» содержит код для обучения моделей изображения и текста. Файлы «EMNIST_Model_Champ.h5» и «TEXT_Model_Champ.Rdata» создаются с использованием кода в этом файле. Это модели изображения и текста соответственно. Давайте поговорим о коде здесь -

Установка требований:
Мы будем использовать тензорный поток для построения многослойной нейронной сети для распознавания изображений. Вам нужно сделать это только один раз и позже, просто вызовите функции library () из кода для загрузки требований в вашу среду.

Подготовка данных для модели изображения:
Данные EMNIST, которые мы загрузили, уже имеют наборы данных для обучения и тестирования по отдельности. Прочтите данные, используя функцию EMNIST_read (), определенную в файле с общими функциями. Поскольку каждая буква или цифра, определенная в наборе данных, является меткой, а не непрерывным значением, давайте также преобразуем y в категориальную переменную с 62 классами (набор данных emnist_byclass)

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

Мы использовали Оптимизатор Адама и точность в качестве показателей для соответствия модели. Наконец, сохраняем модель в формате h5. Формат h5 используется для сохранения моделей, изученных с помощью keras, которые не сохраняются правильно с помощью команды R save.

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

Подготовка данных для текстовой модели:
Так же, как мы делали подготовку данных для построения модели изображения, нам нужно подготовить набор данных для текстовой аналитики. Попытка состоит в том, чтобы обучить модель, которая знает английский язык, чтобы она могла работать, дополняя предсказания по изображениям. Например, слово «никогда». Если модель изображения предсказывает «e» как «c» из-за нечеткого почерка, текстовая модель может исправить это, поскольку она знает язык. Текстовая модель будет знать, что для слова из 5 букв вероятность «e» после «nev» выше по сравнению с вероятностью «c».

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

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

Построение текстовой модели:
Теперь, когда у нас есть предварительно обработанный корпус, мы можем использовать его для изучения языковых функций. Для этой задачи мы написали Скрытую марковскую модель, которая в основном получает вероятность X (i + 1) при X (i) с использованием частотных таблиц. Наконец, давайте сохраним эту модель как файл Text_Model_Champ.Rdata.

Примечание: вы можете использовать любой текстовый корпус для построения этой модели. Как обычно, производительность модели зависит от качества и количества предоставленных обучающих данных. В репозиторий github я поместил образец корпуса (War_and_Peace.txt) для вашей справки / использования.

4. Предугадывай слова:

Файл ‘Word_Predictor_Champ.R’ содержит функцию прогнозирования, которая принимает в качестве входных данных двумерный массив X со значениями пикселей, изученную модель для изображений m: image и изученную текстовую модель m: text. Функция возвращает одномерный массив строковых меток y, где каждый элемент массива представляет собой строку длины L.

Эта функция сначала преобразует входные изображения в форму требуемой матрицы с формой (nxl, 28x28). Затем он использует модель изображения, чтобы получить вероятность каждого символа. Получает вероятность появления следующего символа с использованием текстовой модели (кроме первого символа). Объединяет вероятности из этих обоих, чтобы сделать окончательный прогноз.

5. Улучшения модели:

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

  1. Используйте огромный корпус текста, чтобы улучшить текстовую модель. Вы можете использовать корпус Википедия для обучения лучшей текстовой модели. Или используйте предварительно обученную модель из Интернета
  2. Улучшите модель MLP, добавив больше скрытых слоев / скрытых единиц. Или используйте более сложные модели изображений, такие как CNN.
  3. Обобщите модель, отредактировав файл Code_image_text. В настоящее время код имеет некоторые ограничения, указанные ниже. Отредактировав некоторые жестко запрограммированные части в этом файле, можно сделать модель более универсальной. а. Прогнозирует только изображения размером 28 x 28 пикселей из набора данных EMNIST b. Только предсказывает и обучается на словах из 5 букв. Файл EMNIST_general_functions содержит функцию, которая помогает вам создавать изображения слов из набора данных EMNIST. Эта функция может использоваться для создания различных наборов для обучения / тестирования, устраняя ограничения в 5 слов.

Спасибо за прочтение! Надеюсь, это помогло вам начать работу с распознаванием символов.

Если у вас есть какие-либо вопросы / предложения, вы можете написать здесь свои комментарии или связаться со мной в LinkedIn / Twitter.