前语

计划学习下Tensorflow2,当前的目标是自动辨认出身份证中号码的位置,环境好久前本地建立过,进展便是随机性了有时间了搞下。当然好久没碰就天经地义的忘了,还有个首要原因是当时找的demo没达到我想要的效果。目前还是发挥我得CV神功学的是API因为高数我还给了教师了,还有关于python和TF的API现学现卖了,这篇算入门记录了。

MNIST介绍

MNIST是一个由60000张练习样本和10000张测验样本组成的处理过的图画数据集。留意它不是图片,描绘的是巨细为28*28二值化的图片,二值化的意思是只要黑色和白色的单通道图片,关于颜色通道。

下载到本地很简单可是可是需要网。

# 加载mnist数据集
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

然后文件会下载到这个当地。

Tensorflow2学习之MNIST数据练习和测验

网上找些demo练习结果留意事项

练习集练习过程看到的效果很好,可是想自己画个图加载模型后辨认下基本辨认不出来。网上找了一些说法。

  1. 自己画的图片巨细操控不好在缩放的时候会失真。
  2. 灰度和二值化没区分操控好,练习集的数据都是二值化的。
  3. 国外写字跟国内习气不一样。
  4. 还有提到泛化问题的我还没懂后边学会了再分享。

说下效果吧

Tensorflow2学习之MNIST数据练习和测验

练习

我是看的这本书《TensorFlow深度学习(带目录).pdf》。里边有最原始的API处理数据的,可是怎么保存模型我没搞懂抛弃了。然后网上找了一些高阶的keras处理的说下理解。

# 加载mnist数据集
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 归一化首要把数据放到0-1之间 因为二值化的图片像素点是0,255
x_train, x_test = x_train / 255.0, x_test / 255.0
# 将标签转换成独热编码 留意这儿跟下面模型装备的丢失函数有关系
# 独热是结果只要一位表示 1000000000 表示0
#y_train_onehot = tf.keras.utils.to_categorical(y_train)
#y_test_onehot = tf.keras.utils.to_categorical(y_test)
y_train_onehot =y_train
y_test_onehot =y_test
model = tf.keras.Sequential()
# 28*28 输入的巨细
model.add(tf.keras.layers.Flatten(input_shape=(28, 28)))
# 中心躲藏层激活函数用relu
model.add(tf.keras.layers.Dense(128, activation='relu'))
#随机丢掉一些神经元
model.add(tf.keras.layers.Dropout(0.2))
# 多分类输出一般用softmax分类器
model.add(tf.keras.layers.Dense(10, activation='softmax'))
# 打印模型信息的
model.summary()
# optimizer优化器
# 办法用于在装备练习办法时,告知练习时用的优化器、丢失函数和准确率评测规范
# loss函数运用交叉熵
# 顺序编码用sparse_categorical_crossentropy
# 独热编码用categorical_crossentropy
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
#开始练习
history = model.fit(x_train, y_train_onehot, epochs=20)
test_loss,test_accuracy=model.evaluate(x_test,  y_test_onehot, verbose=2)
print('Accuracy on test_dataset',test_accuracy)
#保存模型
model.save('model.h5')
print('saved total model.')
#首要打印练习后显示练习图取参数对应的
history_dict = history.history
print(history_dict.keys())

模型加载

network = tf.keras.models.load_model('model.h5')
# 调用模型进行预测辨认
im = Image.open(r"9.png")  # 读取图片途径
im = im.resize((28, 28))  # 调整巨细和模型输入巨细共同
im = np.array(im)
print(im.shape)
p3 = im.min(axis=-1)
print(p3.shape)
# # 将白底黑字变成黑底白字   因为练习模型是这种格局
for i in range(28):
    for j in range(28):
        p3[i][j] = 255 - p3[i][j]
# 模型输出结果是每个类别的概率,取最大的概率的类别便是预测的结果
ret = network.predict((p3 / 255.0).reshape((1, 28, 28)))
print(ret)
number = np.argmax(ret, axis=1)
print(number)

自己画图辨认成功的一个

Tensorflow2学习之MNIST数据练习和测验