实现手写数字识别

导入依赖包

将tensorflow、numpy和matplotlib导入,如果已经安装tensorflow则可以不用执行下面这一行代码,如果没有安装tensorflow需要执行下面这一行代码

! pip install tensorflow-cpu==2.4.0 -i https://pypi.douban.com/simple/
Looking in indexes: https://pypi.douban.com/simple/
Requirement already satisfied: tensorflow-cpu==2.4.0 in c:\anaconda\lib\site-packages (2.4.0)
Requirement already satisfied: grpcio~=1.32.0 in c:\anaconda\lib\site-packages (from tensorflow-cpu==2.4.0) (1.32.0)
Requirement already satisfied: flatbuffers~=1.12.0 in c:\anaconda\lib\site-packages (from tensorflow-cpu==2.4.0) (1.12)
Requirement already satisfied: absl-py~=0.10 in c:\anaconda\lib\site-packages (from tensorflow-cpu==2.4.0) (0.12.0)
Requirement already satisfied: six~=1.15.0 in c:\anaconda\lib\site-packages (from tensorflow-cpu==2.4.0) (1.15.0)
Requirement already satisfied: protobuf>=3.9.2 in c:\anaconda\lib\site-packages (from tensorflow-cpu==2.4.0) (3.15.6)
Requirement already satisfied: termcolor~=1.1.0 in c:\anaconda\lib\site-packages (from tensorflow-cpu==2.4.0) (1.1.0)
Requirement already satisfied: wrapt~=1.12.1 in c:\anaconda\lib\site-packages (from tensorflow-cpu==2.4.0) (1.12.1)
Requirement already satisfied: tensorflow-estimator<2.5.0,>=2.4.0rc0 in c:\anaconda\lib\site-packages (from tensorflow-cpu==2.4.0) (2.4.0)
Requirement already satisfied: gast==0.3.3 in c:\anaconda\lib\site-packages (from tensorflow-cpu==2.4.0) (0.3.3)
Requirement already satisfied: wheel~=0.35 in c:\anaconda\lib\site-packages (from tensorflow-cpu==2.4.0) (0.35.1)
Requirement already satisfied: tensorboard~=2.4 in c:\anaconda\lib\site-packages (from tensorflow-cpu==2.4.0) (2.4.1)
Requirement already satisfied: google-pasta~=0.2 in c:\anaconda\lib\site-packages (from tensorflow-cpu==2.4.0) (0.2.0)
Requirement already satisfied: astunparse~=1.6.3 in c:\anaconda\lib\site-packages (from tensorflow-cpu==2.4.0) (1.6.3)
Requirement already satisfied: numpy~=1.19.2 in c:\anaconda\lib\site-packages (from tensorflow-cpu==2.4.0) (1.19.2)
Requirement already satisfied: h5py~=2.10.0 in c:\anaconda\lib\site-packages (from tensorflow-cpu==2.4.0) (2.10.0)
Requirement already satisfied: keras-preprocessing~=1.1.2 in c:\anaconda\lib\site-packages (from tensorflow-cpu==2.4.0) (1.1.2)
Requirement already satisfied: opt-einsum~=3.3.0 in c:\anaconda\lib\site-packages (from tensorflow-cpu==2.4.0) (3.3.0)
Requirement already satisfied: typing-extensions~=3.7.4 in c:\anaconda\lib\site-packages (from tensorflow-cpu==2.4.0) (3.7.4.3)
Requirement already satisfied: google-auth<2,>=1.6.3 in c:\anaconda\lib\site-packages (from tensorboard~=2.4->tensorflow-cpu==2.4.0) (1.27.1)
Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in c:\anaconda\lib\site-packages (from tensorboard~=2.4->tensorflow-cpu==2.4.0) (0.4.3)
Requirement already satisfied: markdown>=2.6.8 in c:\anaconda\lib\site-packages (from tensorboard~=2.4->tensorflow-cpu==2.4.0) (3.3.4)
Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in c:\anaconda\lib\site-packages (from tensorboard~=2.4->tensorflow-cpu==2.4.0) (1.8.0)
Requirement already satisfied: werkzeug>=0.11.15 in c:\anaconda\lib\site-packages (from tensorboard~=2.4->tensorflow-cpu==2.4.0) (1.0.1)
Requirement already satisfied: requests<3,>=2.21.0 in c:\anaconda\lib\site-packages (from tensorboard~=2.4->tensorflow-cpu==2.4.0) (2.24.0)
Requirement already satisfied: setuptools>=41.0.0 in c:\anaconda\lib\site-packages (from tensorboard~=2.4->tensorflow-cpu==2.4.0) (50.3.1.post20201107)
Requirement already satisfied: rsa<5,>=3.1.4; python_version >= "3.6" in c:\anaconda\lib\site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.4->tensorflow-cpu==2.4.0) (4.7.2)
Requirement already satisfied: cachetools<5.0,>=2.0.0 in c:\anaconda\lib\site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.4->tensorflow-cpu==2.4.0) (4.2.1)
Requirement already satisfied: pyasn1-modules>=0.2.1 in c:\anaconda\lib\site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.4->tensorflow-cpu==2.4.0) (0.2.8)
Requirement already satisfied: requests-oauthlib>=0.7.0 in c:\anaconda\lib\site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.4->tensorflow-cpu==2.4.0) (1.3.0)
Requirement already satisfied: chardet<4,>=3.0.2 in c:\anaconda\lib\site-packages (from requests<3,>=2.21.0->tensorboard~=2.4->tensorflow-cpu==2.4.0) (3.0.4)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in c:\anaconda\lib\site-packages (from requests<3,>=2.21.0->tensorboard~=2.4->tensorflow-cpu==2.4.0) (1.25.11)
Requirement already satisfied: certifi>=2017.4.17 in c:\anaconda\lib\site-packages (from requests<3,>=2.21.0->tensorboard~=2.4->tensorflow-cpu==2.4.0) (2020.6.20)
Requirement already satisfied: idna<3,>=2.5 in c:\anaconda\lib\site-packages (from requests<3,>=2.21.0->tensorboard~=2.4->tensorflow-cpu==2.4.0) (2.10)
Requirement already satisfied: pyasn1>=0.1.3 in c:\anaconda\lib\site-packages (from rsa<5,>=3.1.4; python_version >= "3.6"->google-auth<2,>=1.6.3->tensorboard~=2.4->tensorflow-cpu==2.4.0) (0.4.8)
Requirement already satisfied: oauthlib>=3.0.0 in c:\anaconda\lib\site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.4->tensorflow-cpu==2.4.0) (3.1.0)
import tensorflow as tf
from tensorflow.keras.layers import Flatten, Dense
import numpy as np
import matplotlib.pyplot as plt
print(tf.__version__)
2.4.0

加载数据集

使用tensorflow内置的mnist数据集,返回训练集图片、训练集标签、测试集图片、测试集标签

(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
print(train_images.shape, train_labels.shape)
print(test_images.shape, test_labels.shape)
(60000, 28, 28) (60000,)
(10000, 28, 28) (10000,)
fig, ax = plt.subplots(nrows=4, ncols=5, sharex='all', sharey='all')
ax = ax.flatten()
for i in range(20):
    img = train_images[i]
    ax[i].imshow(img)
ax[0].set_xticks([])
ax[0].set_yticks([])
plt.tight_layout()
plt.show()

对图片进行归一化

图片每个像素的数值都是在[0, 255]之间,所以归一化要除以255,数据要是浮点数,所以要添加一个小数点

train_images, test_images = train_images / 255.0, test_images / 255.0

定义模型

搭建一个顺序模型,第一层先将数据展平,原始图片是28x28的灰度图,所以输入尺寸是(28,28),第二层节点数可以自己选择一个合适值,这里用128个节点,激活函数用relu,第三层有多少个种类就写多少,[0, 9]一共有10个数字,所以必须写10,激活函数用softmax

model = tf.keras.Sequential([
    Flatten(input_shape=(28, 28)),
    Dense(1000, activation='relu'),
    Dense(10, activation='softmax')
])

指定优化器、损失函数、评价指标

优化器使用adam,损失函数使用交叉熵损失函数,评价指标用准确率

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['acc'])

训练模型

将训练集输入模型进行训练,一共训练10次

history = model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels), verbose=2)
Epoch 1/10
1875/1875 - 12s - loss: 0.1853 - acc: 0.9443 - val_loss: 0.0948 - val_acc: 0.9710
Epoch 2/10
1875/1875 - 11s - loss: 0.0754 - acc: 0.9771 - val_loss: 0.0686 - val_acc: 0.9783
Epoch 3/10
1875/1875 - 11s - loss: 0.0491 - acc: 0.9845 - val_loss: 0.0757 - val_acc: 0.9767
Epoch 4/10
1875/1875 - 11s - loss: 0.0341 - acc: 0.9890 - val_loss: 0.0797 - val_acc: 0.9772
Epoch 5/10
1875/1875 - 11s - loss: 0.0260 - acc: 0.9918 - val_loss: 0.0891 - val_acc: 0.9772
Epoch 6/10
1875/1875 - 11s - loss: 0.0206 - acc: 0.9932 - val_loss: 0.0727 - val_acc: 0.9820
Epoch 7/10
1875/1875 - 11s - loss: 0.0182 - acc: 0.9940 - val_loss: 0.0633 - val_acc: 0.9824
Epoch 8/10
1875/1875 - 11s - loss: 0.0142 - acc: 0.9950 - val_loss: 0.0883 - val_acc: 0.9807
Epoch 9/10
1875/1875 - 11s - loss: 0.0143 - acc: 0.9954 - val_loss: 0.0938 - val_acc: 0.9800
Epoch 10/10
1875/1875 - 11s - loss: 0.0114 - acc: 0.9960 - val_loss: 0.1023 - val_acc: 0.9801
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
flatten (Flatten)            (None, 784)               0         
_________________________________________________________________
dense (Dense)                (None, 1000)              785000    
_________________________________________________________________
dense_1 (Dense)              (None, 10)                10010     
=================================================================
Total params: 795,010
Trainable params: 795,010
Non-trainable params: 0
_________________________________________________________________

用测试集验证模型效果

用测试集去验证训练好的模型,日志等级设置为2

test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print('Test loss:', test_loss)
print('Test acc:', test_acc)
313/313 - 1s - loss: 0.1023 - acc: 0.9801
Test loss: 0.10226897895336151
Test acc: 0.9800999760627747

将图片输入模型,返回预测结果

将测试集中的第一张图片输入模型,看是哪个数字的概率最大,并输出真实值

predictions = model.predict(test_images)
print('预测值:', np.argmax(predictions[0]))
print('真实值:', test_labels[0])
plt.imshow(test_images[0])
plt.show()
预测值: 7
真实值: 7

显示模型准确率的变化过程

#横坐标、纵坐标、标签
plt.plot(history.epoch, history.history.get('acc'), label='acc')
plt.plot(history.epoch, history.history.get('val_acc'), label='val_acc')
plt.legend()       #绘图
plt.show()         #显示图像

显示模型损失的变化过程

plt.plot(history.epoch, history.history.get('loss'), label='loss')
plt.plot(history.epoch, history.history.get('val_loss'), label='val_loss')
plt.legend()
plt.show()

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 2621041184@qq.com