Рукописный решатель уравнений на Python

Опубликовано: 23 Июля, 2021

Получение данных обучения

  • Скачивание набора данных
      Загрузите набор данных по этой ссылке . Распакуйте zip-файл. Будут разные папки, содержащие изображения для разных математических символов. Для простоты используйте 0–9 цифр, +,? -? И, умноженные на изображения в нашем решателе уравнений. Наблюдая за набором данных, мы видим, что он смещен для некоторых цифр / символов, поскольку он содержит 12000 изображений для одного символа и 3000 изображений для других. Чтобы устранить эту предвзятость, уменьшите количество изображений в каждой папке до прибл. 4000.
  • Извлечение функций
      Мы можем использовать извлечение контура для получения признаков.

    1. Инвертируйте изображение, а затем преобразуйте его в двоичное изображение, потому что извлечение контура дает лучший результат, когда объект белый, а окружение - черное.
    2. Для поиска контуров используйте функцию findContour. Для функций получите ограничивающий прямоугольник контура с помощью функции boundingRect (ограничивающий прямоугольник - это наименьший горизонтальный прямоугольник, охватывающий весь контур).
    3. Поскольку каждое изображение в нашем наборе данных содержит только один символ / цифру, нам нужен только ограничивающий прямоугольник максимального размера. Для этого вычисляем площадь ограничивающего прямоугольника каждого контура и выделяем прямоугольник с максимальной площадью.
    4. Теперь измените размер прямоугольника, ограничивающего максимальную область, до 28 на 28. Измените его форму до 784 на 1. Таким образом, теперь будут 784-пиксельные значения или функции. Теперь дайте ему соответствующую метку (например, для изображений 0–9 такая же метка, что и их цифра, для - присвоить метку 10, для + присвоить метку 11, для времен присвоить метку 12). Итак, теперь наш набор данных содержит 784 столбца функций и один столбец меток. После извлечения функций сохраните данные в файл CSV.

    Данные обучения с использованием сверточной нейронной сети

      Поскольку сверточная нейронная сеть работает с двумерными данными, и наш набор данных имеет форму 785 на 1. Следовательно, нам нужно изменить его форму. Во-первых, назначьте столбец меток в нашем наборе данных переменной y_train. Затем отбросьте столбец меток из набора данных и измените форму набора данных на 28 на 28. Теперь наш набор данных готов для CNN.
  • Построение сверточной нейронной сети
      Для создания CNN импортируйте все необходимые библиотеки.




    import pandas as pd
    import numpy as np
    import pickle
    np.random.seed( 1212 )
    import keras
    from keras.models import Model
    from keras.layers import * from keras import optimizers
    from keras.layers import Input , Dense
    from keras.models import Sequential
    from keras.layers import Dense
    from keras.layers import Dropout
    from keras.layers import Flatten
    from keras.layers.convolutional import Conv2D
    from keras.layers.convolutional import MaxPooling2D
    from keras.utils import np_utils
    from keras import backend as K
    K.set_image_dim_ordering( 'th' )
    from keras.utils.np_utils import to_categorical
    from keras.models import model_from_json
      Преобразуйте данные y_train в категориальные данные с помощью функции to_categorical. Для создания модели используйте следующую строку кода.




    model = Sequential()
    model.add(Conv2D( 30 , ( 5 , 5 ), input_shape = ( 1 , 28 , 28 ), activation = 'relu' ))
    model.add(MaxPooling2D(pool_size = ( 2 , 2 )))
    model.add(Conv2D( 15 , ( 3 , 3 ), activation = 'relu' ))
    model.add(MaxPooling2D(pool_size = ( 2 , 2 )))
    model.add(Dropout( 0.2 ))
    model.add(Flatten())
    model.add(Dense( 128 , activation = 'relu' ))
    model.add(Dense( 50 , activation = 'relu' ))
    model.add(Dense( 13 , activation = 'softmax' ))
    # Compile model
    model. compile (loss = 'categorical_crossentropy' ,
    optimizer = 'adam' , metrics = [ 'accuracy' ])
  • Подгонка модели к данным
      Для подгонки CNN к данным используйте следующие строки кода.




    model.fit(np.array(l), cat, epochs = 10 , batch_size = 200 ,
    shuffle = True , verbose = 1 )
      Обучение нашей модели с точностью 98,46% займет около трех часов. После обучения мы можем сохранить нашу модель как файл json для использования в будущем, чтобы нам не приходилось обучать нашу модель и каждый раз ждать по три часа. Чтобы сохранить нашу модель, мы можем использовать следующую строку кодов.




    model_json = model.to_json()
    with open ( "model_final.json" , "w" ) as json_file:
    json_file.write(model_json)
    # serialize weights to HDF5
    model.save_weights( "model_final.h5" )

    Тестирование нашей модели или решение уравнения с ее помощью

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




    json_file = open ( 'model_final.json' , 'r' )
    loaded_model_json = json_file.read()
    json_file.close()
    loaded_model = model_from_json(loaded_model_json)
    # load weights into new model
    loaded_model.load_weights( "model_final.h5" )
  • Теперь введите изображение, содержащее рукописное уравнение. Преобразуйте изображение в двоичное изображение, а затем инвертируйте изображение (если цифры / символы черные).
  • Теперь получите контуры изображения, по умолчанию оно будет получать контуры слева направо.
  • Получите ограничивающий прямоугольник для каждого контура.
  • Иногда это приводит к появлению двух или более контуров для одной и той же цифры / символа. Чтобы этого избежать, проверьте, перекрывается ли ограничивающий прямоугольник этих двух контуров. Если они перекрываются, отбросьте меньший прямоугольник.
  • Теперь измените размер всего оставшегося ограничивающего прямоугольника до 28 на 28.
  • Используя модель, спрогнозируйте соответствующую цифру / символ для каждого ограничивающего прямоугольника и сохраните его в строке.
  • После этого используйте функцию eval для строки, чтобы решить уравнение.


      Загрузите полный код для рукописного решателя уравнений отсюда.

      Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

      Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.