0%

如何使用keras训练的模型识别手写字

今天我们来介绍如何使用keras训练的模型识别手写字。

其完整的过程分为以下几个步骤:

  • 获取训练数据集,构建模型并进行训练
  • 保存模型和权重
  • 加载模型和权重
  • 对用户输入的手写字图片进行预处理
  • 对手写字进行识别

下面我们就按照上面的步骤一步步操作吧。

构建模型

我们先构建一个简单的深度网络模型,然后进行训练。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import tesnorflow as tf

#下载mnist数据集
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()

#构建模型
#Dropout层的作用是防止过拟合,原理是随机丢弃一部分神经元,防止某个神经元的权重被过度训练
#为什么Dropout层可以防止过拟合呢?
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])

#编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
#训练模型
model.fit(train_image, train_labels, epochs=5)
model.evaluate(test_images, test_labels)

#保存模型和权重
model.save('model.keras')

构建模型和训练模型,代码很简单,就不多说了。

加载模型和权重

我们可以使用keras提供的load_model方法加载模型和权重,代码如下:

1
2
3
4
5
import tensorflow as tf

#加载模型和权重
model = tf.keras.models.load_model('model.keras')
model.summary()

加载模型和权重的代码也很简单,这里就不再赘述了。

预处理输入的手写字图片

我们需要将用户输入的手写字图片进行预处理,才能在模型中进行识别。预处理步骤如下:

  • 将图片转换为灰度图
  • 将图片缩放为28x28大小
  • 将图片转换为numpy数组

预处理代码如下:

1
2
3
4
5
6
7
8
9
import cv2
import numpy as np
def preprocess(image):
#将图片转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#将图片缩放为28x28大小
resized = cv2.resize(gray, (28, 28))
#将图片转换为numpy数组
return np.array([resized])

这里写了一个函数,其作用就是将用户输入的手写字图片转换为灰度图,缩放为28x28大小,并转换为numpy数组。

对手写字进行识别

得到转换后的图片,就可以使用我们之前加载好的模型对图片进行识别了,代码如下:

1
2
3
4
5
6
7
8
9
10
...
#读取用户输入的手写字图片
img = cv2.imread('user_input.jpg')
preprocessed_img = preprocess(img)
print(preprocessed_img.shape)
print(preprocessed_img)
#识别手写字
prediction = model.predict(preprocessed_img)
print(prediction)
...

小结

总结一下,通过mnist我们就将深度学习从训练到布署到应用的完整过程向你介绍清楚了。

在大多数情况下我们都是使用别人训练好的模型,但如果找不到训练好的模型时,我们就可以自己进行训练。

  • 本文作者: 音视跳动-李超 [avdance@163.com]
  • 本文链接: https://blog.avdancedu.com/941819c/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道