В области науки о данных приложение «hello world» распознает рукописные цифры в наборе данных MNIST. Он предоставляет обучающий набор из 60 000 примеров и тестовый набор из 10 000 примеров. С другой стороны, есть набор данных EMNIST, который является расширенной версией MNIST, также содержащий рукописные буквы.

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

Изучение науки о данных на практике

Если вы хотите изучать науку о данных на практике, я предлагаю вам записаться на курс Data Scientist компании DataCamp с курсом Python Carrier. (На премиальный план теперь скидка 75%, так что сейчас идеальное время, чтобы попробовать.) Я прошел этот курс за 1 месяц, потратив на него 4 часа ежедневной работы. , заканчивая 4 курса / день. Довольно симпатичный, понравился благодаря следующим фактам:

  • Начинал с базового Python, но я еще кое-чему научился. Так что это хорошо для новичков.
  • У них есть курс навыков под названием: Лучшие практики кодирования с помощью Python, где я научился писать эффективный код, как оптимизировать, что оптимизировать. Иметь знание учит хорошему.
  • Курсы содержат много кода и поэтапно знакомят вас с проблемами науки о данных.
  • Я мог смотреть видео с удвоенной скоростью, чтобы закончить 4 курсами в день раньше.
  • Я зарегистрировался в LinkedIn, но на второй день у меня возникла проблема, я отправил им электронное письмо и получил ответ через 30 минут, и они также устранили ошибку.
  • У них есть мобильное приложение, в котором вы можете тренироваться в дороге или на месте…

«Где даже король идет пешком».

Вы можете зарегистрироваться здесь.

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

Итак, как мы решили проект….

Распознавание рукописных писем

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

    model = Sequential()
    model.add(Conv2D(32, kernel_size=(3, 3),strides=1,activation='relu'))
    model.add(Conv2D(32, (3, 3), activation='relu', strides=1))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(num_classes, activation='softmax'))

Получили следующий результат:

Модель должна быть сначала проверена на данных обучения. Если он не может достичь высокой точности на обучающих данных, это означает, что модель слишком проста. Здесь мы видим, что точность обучения выше 95%, поэтому модель проходит этот тест. Следующая проверка - это настоящие данные проверки. Если точность проверки и обучения сходятся в разных направлениях, значит, модель не может обобщать входные данные. Так обстоит дело с нашей моделью. Поэтому мы должны внести некоторые изменения. Во-первых, мы добавили пакетную нормализацию после каждой свертки. Интересный факт: если вы не добавите input_shape в модель, ваша модель не сможет сойтись.

    model = Sequential()
    model.add(Conv2D(32, kernel_size=(3, 3), strides=1,activation='relu', input_shape = (28, 28, 1)))
    model.add(BatchNormalization())
    model.add(Conv2D(32, (3, 3), activation='relu', strides=1))
    model.add(BatchNormalization())
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(num_classes, activation='softmax'))

Его результат следующий:

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

    model = Sequential()
    model.add(Conv2D(32, kernel_size=(3, 3), strides=1,activation='relu', input_shape = (28, 28, 1)))
    model.add(BatchNormalization())
    model.add(Conv2D(32, (3, 3), activation='relu', strides=1))
    model.add(BatchNormalization())
    model.add(Dropout(0.4))
    model.add(Flatten())
    model.add(Dropout(0.4))
    model.add(Dense(128, activation='relu'))
    model.add(Dense(num_classes, activation='softmax'))

Его результат следующий:

Это дает лучшую проверку и результаты тестирования. Но все же это недопустимо. Проблема может быть в слишком мелкой сети. Поэтому мы попробовали модель, которая используется для обеспечения точности 99,75% на наборе данных MNIST, и попытались изучить символы.

    model = Sequential()
    model.add(Conv2D(32, kernel_size = 3, activation='relu', input_shape = (input_size[0], input_size[1], input_size[2])))
    model.add(BatchNormalization())
    model.add(Conv2D(32, kernel_size = 3, activation='relu'))
    model.add(BatchNormalization())
    model.add(Conv2D(32, kernel_size = 5, strides=2, padding='same', activation='relu'))
    model.add(BatchNormalization())
    model.add(Dropout(0.4))

    model.add(Conv2D(64, kernel_size = 3, activation='relu'))
    model.add(BatchNormalization())
    model.add(Conv2D(64, kernel_size = 3, activation='relu'))
    model.add(BatchNormalization())
    model.add(Conv2D(64, kernel_size = 5, strides=2, padding='same', activation='relu'))
    model.add(BatchNormalization())
    model.add(Dropout(0.4))

    model.add(Conv2D(128, kernel_size = 4, activation='relu'))
    model.add(BatchNormalization())
    model.add(Flatten())
    model.add(Dropout(0.4))
    model.add(Dense(output_size, activation='softmax'))

Кривая обучения модели видна на этом рисунке.

Как видите, это пока лучший результат для нас. Точность прогнозов тоже пока самая лучшая. Но это может быть даже лучше, если дополнить входные и проверочные данные. Увеличение означает создание дополнительных изображений из уже существующих путем поворота, зеркального отражения, обрезки, blabla исходных. Это классно, так что проверьте его и спрячьте в задний карман на случай, если он вам понадобится. :)

При аугментации результат следующий:

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

Он показывает, как использовать эльфийские буквы в качестве кодировки английских символов. Затем мы вручную нарисовали персонажей тенгвара на нашем распечатанном шаблоне. Затем мы сфотографировали каждую страницу с помощью CamScanner (без рекламы). Обрезал внешний край изображений в программе. Затем мы создали программу, которая анализирует эти входные изображения и создает для них папку, которую можно проанализировать с помощью команды tensorflow flow_from_dir. Что можно использовать и с увеличением данных. Таким образом, мы получили 156 изображений, это действительно небольшая база данных. Итак, мы использовали аугментацию, чтобы заработать несколько тысяч.

Результат примерки следующий.

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

Распознавание рукописных цифр

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

Для работы с цифрами Тенгвара необходимо составить набор данных. Мы хотели сделать набор данных цифр иначе, чем набор данных букв, поэтому мы создали приложение, в котором мы можем рисовать цифры одну за другой и сохранять их как изображения PNG размером 64x64. (Если вы используете наше приложение, пожалуйста, заполните метку правильно. Наш алгоритм еще не умеет читать мысли.) На следующем этапе мы преобразовали изображения в csv-файлы, как в наборе данных MNIST, поэтому мы можем использовать почти такие же ноутбук. Модель Кераса, которая ранее использовалась для данных MNIST, может обеспечить примерно 100-процентную точность на наборе поездов, но только 75 процентов на проверочном наборе. Так что нам немного грустно, но давайте сделаем лучше!

Таким образом, нет предвзятости, что является хорошей новостью, но существует большая разница. Как мы можем это уменьшить? Нам нужно увеличить увеличение и отсев. Мы также можем использовать технику ранней остановки, чтобы алгоритм не переучивал данные поезда. Кроме того, результат будет намного более надежным, если мы будем использовать перекрестную проверку для небольшого набора данных, подобного этому. А теперь вернемся к результату….

Тада! В среднем около 92% при перекрестной проверке! Вы можете видеть, что точность обучения и проверки перекрывается во время итераций. Мы очень довольны результатом! Но давайте все равно попробуем переносное обучение. Итак, мы получаем обученную нейронную сеть, ранее использовавшуюся для набора данных MNIST, отсекаем последние два плотных слоя, замораживаем сверточные слои, меняем входные и выходные данные и вперед!

Мы не можем достичь точности выше 70%… И еще одно обобщение тоже не помогает. Ухудшение производительности, вероятно, связано с тем, что нам пришлось преобразовать изображения в размер 28x28 пикселей, что значительно уменьшило количество информации в изображениях, возможно, это была проблема.

Вы можете увидеть небольшую визуализацию того, как алгоритм группирует цифры с помощью анализа главных компонентов в 2d и 3d.

Также мы нарисовали неверно угаданных персонажей, их всего несколько.

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

Полезные ссылки

Разбор символов (Github): https://github.com/elearn-inga/tengwar-digit-parser

Нарисуйте новые помеченные примеры здесь (приложение): https://elearningatest.pythonanywhere.com/

Распознавание символов (приложение): https://tengwar-digit.herokuapp.com

Источник приложения для распознавания символов (Github): https://github.com/elearn-inga/character-drawing-flask-app

MNIST Kaggle Challenge (вызов): https://www.kaggle.com/c/digit-recognizer

Распознавание символов Tengwar (блокнот): https://www.kaggle.com/swordey/handwritten-letter-recognition-with-a-flick

Решение задачи MNIST Kaggle (блокнот): https://www.kaggle.com/andorhofecker/99-4-model-pca-visualizations-error-analysis

Блокнот (блокнот) для распознавания цифр Tengwar: https://www.kaggle.com/andorhofecker/elvish-tengwar-digit-recognition

База данных Tengwar digits (набор данных): https://www.kaggle.com/elearninga/tengwar-digits-dataset

Модель из ядра Kaggle, используемая в распознавании символов (блокнот): https://www.kaggle.com/cdeotte/25-million-images-0-99757-mnist