一、MNIST数据集介绍:是由0〜9手写数字图片和数字标签所组成的,由60000个训练样本和10000个测试组成。
二、tf2.0.0导入MNIST数据集的方法:
from tensorflow.examples.tutorials.mnist import input_data
我的电脑是tf2.6.0,导入MNIST数据集的方法:
from tensorflow.keras.datasets import mnist
三、代码模块:
代码引用自:https://blog.csdn.net/JulyLi2019/article/details/106248212/
上代码:
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
运行结果:
当然这里我们可以通过模型保存与载入把训练与测试分开:
训练:
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()
测试:
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)
之后就可以用训练好的模型对手写汉字图片进行预测了!
四、对手写汉字进行预测୧(๑•̀◡•́๑)૭
首先先在电脑某处保存一张手写0-9数字
代码:
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'C:\Users\12393\Desktop\8.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)
我的图片路径为C:\Users\12393\Desktop\8.png。
图片:
运行结果:
注:本人不是计算机视觉处理方向的学生,对计算机视觉处理也是小白一枚,欢迎留言沟通━(`∀´)ノ亻!