首页 国际新闻正文

农家仙田,运用Keras建立卷积神经网络进行手写辨认的入门(包括代码解读),元素周期表口诀

本文是发在Medium上的一篇博客:《Handwritten Equation Solver using Convolutional Neural Network》。本文是原文的翻译。这篇文章首要教咱们怎么运用keras练习手写字符的辨认,并保存练习好的模型到本地,以及未来怎么调用保存到模型来猜测。本文对一些不太清晰的当地做了一点小注释。论文运用了cv2的包做预处理,并运用keras搭建了卷积网络。

首要目录如下

  • 介绍
  • 获取练习数据
  • 1.下载数据集
  • 2.抽取特征
  • 运用卷积神经网络练习数据
  • 1.构建卷积神经网络
  • 2.将模型拟合到数据
  • 测验模型

介绍

跟着技能的前进,机器学习和深度学习在当今年代起着至关重要的作用。现在,男裸机器学习和深度学习技能正被用于手写辨认,机器人技能,人工智能以及更多范畴。开发此类体系需求运用数据练习咱们的机器,使其能够学习并进行必要的猜测。本文介绍了一种手写方程求解器,经过手写数字和数学符号练习,运用卷积神经网络和一些图画处理技能,完成98.46%的精度。

获取练习数据

1.下载数据集

咱们能够从这个链接下载数据集。解压缩zip文件。不同的文件夹包括不同数学符号的图画。为简略起见,咱们在本次学习中只是运用0-9数字图画,以及“+”、“-”和“”三个符号图画。在调查我寻龙诀八卦阵定位口诀们的数据集时,咱们能够看到它对某些数字/符号有误差,因为某些符号包括了12000个图画,可是其他符圆圆大光头号只包括了3000个图画。要消除此误差,请将每个文农家仙田,运用Keras树立卷积神经网络进行手写辨认的入门(包括代码解读),元素周期表口诀件夹中的图画数量削减到约 4000左右。

2.抽取特征

咱们能够运用概括提取(contour extraction)技能来取得特征(留意,这儿作者并没有清晰阐明概括提取的办法,其实源我的女代码中首要运用cv2的包来获取图片的概括)。首要过程包生化公园括:

  1. 回转图画然后将其转换为二进制图画,因为当目标为白色且周围为黑色时,概括提取会发生最佳成果。
  2. 要查找概括,请运用“findContour”功用。关于特征,咱们运用’boundingRect’函数取得概括的鸿沟矩形(鸿沟矩形是围住整个概括的最小水平矩形)。
  3. 因为数据会集的每个图画只包括一个符号/数字,因而咱们只需求最大尺农家仙田,运用Keras树立卷积神经网络进行手写辨认的入门(包括代码解读),元素周期表口诀寸的鸿沟矩形。为农家仙田,运用Keras树立卷积神经网络进行手写辨认的入门(包括代码解读),元素周期表口诀此,咱们核算每个概括的鸿沟矩形的面积,并挑选具有最大面积的矩形。
  4. 现在,将最大区域鸿沟矩形的巨细调整为28乘以28,然后压平,变成784乘以1。因而,现在将有784像素值或特征。现在,给它相应的标签(例如,关于0-9图画与其数字相同的标签,关于 - 指定标签10,关于+指定标签11,“”指定标签12)。所以现在咱们的数据集包括784个特征列和一个标签列。提取特征后,将数据保存为CSV文件。

原文没有任何代码,我从他的Github上找到了相关代码,供咱们参阅。首要代秘爱豪门小太太码包括:

def load_images_from_folder(folder):
train_data=[]
for filename in os.listdir(folder):
img = cv2.imread(os六合游身尺.path.join(folder,filename),cv2.IMREAD_GRAYSCALE)
img=~img
if img is not None:
# 这个办法首要是像素高于阈值时,给像素赋予新值,不然,赋予别的一种色彩,这个操作是为了让概括提取作用更好
ret,thresh=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# 这个方农家仙田,运用Keras树立卷积神经网络进行手写辨认的入门(包括代码解读),元素周期表口诀法便是提取概括
ret,ctrs,ret=c旧爱难寻v2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
cnt=sorted(ctrs, key=lambda 农家仙田,运用Keras树立卷积神经网络进行手写辨认的入门(包括代码解读),元素周期表口诀ctr: cv2.boundingRect(ctr)[0])
卢修熙w=i普斯帕nt(28)
h=in农家仙田,运用Keras树立卷积神经网络进行手写辨认的入门(包括代码解读),元素周期表口诀t(28)
maxi=0
for c in cnt:
x,y,w,h=cv2.boundingRect(c)
maxi=max(w*h,maxi)
if maxi==w*h:
x_max=x
y_max=y
w_max=w
h_max=h
im_crop= thresh[y_max:y_max+h_max+10, x_max:x_max+w_max+10]
im_resize = cv2.resize(im_crop,(28,28))
im_resize=np.reshape(im_resize,(784,1))
train_data.append(im_resize)
return train_data

运用卷积神经网络练习数据

因为卷积神经网络在二维数据上作业,咱们的数据集是785乘1的方式。因而,咱们需求重塑它。 首要,将数据会集的标签列分配给变量y_train。 然后从数据会集删去标签列,然后将数据集从头变成28乘28.现在,咱们的数据集已准备好用于CNN。

1.构建卷积神经网络

要制造CNN,请导入一切必需的库。

import pandas as pd
import numpy as np
import pickle
np.random.seed(1212)
import keras
from keras.mo茅于轼事情始末dels 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_fro中年熊m_json

运用“to_categorical”函数将y_train数据转换为分类数据。创立模型的代码如下:

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'])

2.将模型拟合到数据

要使CNN拟合数据,请运用以下代码行。

mo幼女被del.fit(np.array(l), cat, epochs=10, batch_size=200,shuffle=True,verbose=1)

练习咱们的模型需求大约三个小时,准农家仙田,运用Keras树立卷积神经网络进行手写辨认的入门(包括代码解读),元素周期表口诀确率为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 we重返伊甸园上集国语版ights into new model
loaded_model.load_weights("model_final.h5")
  1. 现在,输入包括手写数字的图画。 将图画转钢铁擂台换为二进制图画,然后回转图画(假如数字/符号为黑色)。
  2. 现在默许获取图画的概括,它将从左到右取得概括。
  3. 获取每个概括的鸿沟矩形。
  4. 有时,咱们可能会取得相同数字/符号的两个或更多概括。 为防止这种状况,咱们能够检双穴妫河漂流查这两个概括的鸿沟矩形是否堆叠。 假如它们堆叠,则丢掉较小的矩形。
  5. 现在,将一切剩下的鸿沟矩形调整罗献忠为28乘28。
  6. 运用咱们的模型,猜测每个鸿沟矩形的相应数字/符号并将其存储在字符串中。
  7. 之后,在字符串上运用’eval’函数来求解方程。

完好代码资源参阅:https://github.com/vipul79321/Handwritten-Equation-Solver

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

龙年,立异器械增速安稳 国产占比超七成,谷歌在线翻译