基于tensorflow2.0的手写数字识别

之前用的tensorflow1.x版本感觉很费劲,这次尝试用tensorflow2.0版本实现下,实现容易实现多了,再也不用with tf.Session() as sess了。
文章细节后续有空再补,直接上代码。

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 加载mnist数据集
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# print(x_train.shape)
# plt.imshow(x_train[0])
x_train, x_test = x_train / 255.0, x_test / 255.0  # 归一化
y_train_onehot = tf.keras.utils.to_categorical(y_train)  # 将标签转换成独热编码
y_test_onehot = tf.keras.utils.to_categorical(y_test)

model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28, 28)))  # 28*28
model.add(tf.keras.layers.Dense(128, activation='relu'))   # 中间隐藏层激活函数用relu
model.add(tf.keras.layers.Dense(10, activation='softmax'))  # 多分类输出一般用softmax分类器

#loss函数使用交叉熵
# 顺序编码用sparse_categorical_crossentropy
# 独热编码用categorical_crossentropy
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['acc'])

history = model.fit(x_train, y_train_onehot, epochs=5)

model.evaluate(x_test, y_test_onehot)

# predict=model.predict(y_test)
#
# predict.shape

这是最终的训练结果:基于tensorflow2.0的手写数字识别_第1张图片
这是test测试效果,还不错:基于tensorflow2.0的手写数字识别_第2张图片
当然这里我们可以通过模型保存与载入把训练与测试分开:
mnist_train.py

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 加载mnist数据集
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# print(x_train.shape)
# plt.imshow(x_train[0])
x_train, x_test = x_train / 255.0, x_test / 255.0  # 归一化
y_train_onehot = tf.keras.utils.to_categorical(y_train)  # 将标签转换成独热编码
y_test_onehot = tf.keras.utils.to_categorical(y_test)

model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28, 28)))  # 28*28
model.add(tf.keras.layers.Dense(128, activation='relu'))   # 中间隐藏层激活函数用relu
model.add(tf.keras.layers.Dense(10, activation='softmax'))  # 多分类输出一般用softmax分类器

#loss函数使用交叉熵
# 顺序编码用sparse_categorical_crossentropy
# 独热编码用categorical_crossentropy
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['acc'])

history = model.fit(x_train, y_train_onehot, epochs=5)

model.save('model.h5')
print('saved total model.')

# plt.plot(history.epoch,history.history.get('accuracy'),label='accuracy')
# plt.legend()
# plt.show()

mnist_test.py

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 加载mnist数据集
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# print(x_train.shape)
# plt.imshow(x_train[0])
x_train, x_test = x_train / 255.0, x_test / 255.0  # 归一化
y_train_onehot = tf.keras.utils.to_categorical(y_train)  # 将标签转换成独热编码
y_test_onehot = tf.keras.utils.to_categorical(y_test)

network = tf.keras.models.load_model('model.h5')
network.evaluate(x_test, y_test_onehot)

到这里,小伙伴们是不是觉得这个入门实战有点空洞,下面我们用训练好的模型来预测一张数字图片。
首先我们自己制作一个数字图片,我用的是电脑自带的画图工具做的,效果如下图:
基于tensorflow2.0的手写数字识别_第3张图片
下面为测试单张图片的代码test_one_img.py:

import tensorflow as tf
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import pandas as pd

new_model = tf.keras.models.load_model('model.h5')

# 调用模型进行预测识别
im = Image.open(r"7.png")  # 读取图片路径
im = im.resize((28, 28))  # 调整大小和模型输入大小一致
im = np.array(im)

# 对图片进行灰度化处理
p3 = im.min(axis=-1)
# plt.imshow(p3, cmap='gray')

# 将白底黑字变成黑底白字   由于训练模型是这种格式
for i in range(28):
    for j in range(28):
        p3[i][j] = 255-p3[i][j]

# 模型输出结果是每个类别的概率,取最大的概率的类别就是预测的结果
ret = new_model.predict((p3 / 255).reshape((1, 28, 28)))
print(ret)
number = np.argmax(ret)
print(number)

下面为运行结果:7
基于tensorflow2.0的手写数字识别_第4张图片
预测还是准确的。
修改日期:2020.6.29

你可能感兴趣的:(深度学习,tensorflow,深度学习)