Реализация предиктора изображения в слово в R.
Я давно не вносил свой вклад в сообщество. Я вернулся, чтобы отдать должное. Но перед этим позвольте мне рассказать вам, чем я занимался все это время. Ключевыми моментами всех этих месяцев в профессиональном плане стали две вещи. Во-первых, я выступал на конференции по науке о данных в марте (издание WiDS в Мумбаи). Во-вторых, я стал участником открытого исходного кода и получил запрос на перенос, объединенный в пакет numpy. Ура!
Хорошо, давайте начнем с машинного обучения. Я кратко расскажу о процессе моделирования и укажу вам на репозиторий github, в котором размещены все файлы и коды для их реализации.
Задача
Создайте модель для определения 5-буквенных английских слов из текстовых изображений. Эти слова созданы с использованием букв из набора данных EMNIST, который представляет собой набор рукописных цифр символов, преобразованных в формат изображения 28x28 пикселей и структуру набора данных, которая напрямую соответствует набору данных MNIST. Подробнее об этом можно узнать здесь.
Решение
Для решения этой проблемы построим две модели.
- Модель изображения. Предиктор слов, который берет изображение и угадывает, что на нем написано, путем распознавания изображения с помощью многослойного перцептрона.
- Текстовая модель: это будет дополнять модель изображения. Задача этой модели будет заключаться в том, чтобы выдать вероятность следующего символа на основе предыдущего символа, используя скрытую марковскую модель. Например, какова будет вероятность появления e после буквы n, a или x.
Шаги
Пожалуйста, обратитесь к этому репозиторию git, чтобы выполнить следующие шаги:
1. Загрузите набор данных с сайта EMNIST:
- Прокрутите вниз и нажмите «Набор данных формата Matlab».
- Будет загружен файл «Matlab.zip». Разархивируйте его, и вы найдете 6 наборов данных MS Access. Мы используем набор данных emnist-byclass для этой задачи, потому что в нем есть все символы
- Прочтите этот набор данных в R в первый раз, используя библиотеку «R.matlab»
- После загрузки сохраните набор данных в формате 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% точности на уровне персонажа. Ниже приведены несколько идей, которые вы можете попробовать улучшить эту модель:
- Используйте огромный корпус текста, чтобы улучшить текстовую модель. Вы можете использовать корпус Википедия для обучения лучшей текстовой модели. Или используйте предварительно обученную модель из Интернета
- Улучшите модель MLP, добавив больше скрытых слоев / скрытых единиц. Или используйте более сложные модели изображений, такие как CNN.
- Обобщите модель, отредактировав файл Code_image_text. В настоящее время код имеет некоторые ограничения, указанные ниже. Отредактировав некоторые жестко запрограммированные части в этом файле, можно сделать модель более универсальной. а. Прогнозирует только изображения размером 28 x 28 пикселей из набора данных EMNIST b. Только предсказывает и обучается на словах из 5 букв. Файл EMNIST_general_functions содержит функцию, которая помогает вам создавать изображения слов из набора данных EMNIST. Эта функция может использоваться для создания различных наборов для обучения / тестирования, устраняя ограничения в 5 слов.
Спасибо за прочтение! Надеюсь, это помогло вам начать работу с распознаванием символов.
Если у вас есть какие-либо вопросы / предложения, вы можете написать здесь свои комментарии или связаться со мной в LinkedIn / Twitter.