[Python] MNIST手写数字识别

先导入模块

import numpy as np
import pandas as pd
from keras.datasets import mnist
from keras.utils import to_categorical

载入数据

接下来,执行

f = mnist.load_data() 

结果报错,只能用断点续传下载工具下载相关文件
https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
下载后,我复制到下面的目录
D:\Program Files\Python\Lib\site-packages\keras\datasets
然后,执行

path = "D:\Program Files\Python\Lib\site-packages\keras\datasets\mnist.npz"
f = np.load(path)
x_train, y_train, x_test,y_test = f['x_train'],f['y_train'],f['x_test'],f['y_test']
f.close()

这次很顺利

看看数据形状

print ("特征集张量形状:", x_train.shape)
print ("特征集张量形状:", y_train.shape)
输出:
特征集张量形状: (60000, 28, 28)
特征集张量形状: (60000,)

有兴趣也可以看看样本长啥样,一个手写的数字5的形状

print ("第一个数据样本:", x_train[0])
print ("第一个标签样本:", y_train[0])

格式转换工作

增加一个维度

x_train_ex = x_train.reshape(60000, 28, 28, 1)
x_test_ex = x_test.reshape(10000, 28, 28, 1)
x_train_ex.shape
输出:
(60000, 28, 28, 1)

特征转为one-hot编码

y_train_ex = to_categorical(y_train, 10)
y_test_ex = to_categorical(y_test, 10)

选择学习模型

下面使用卷积神经网络

from keras import models
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
model = models.Sequential() # 用序贯方式建立模型
model.add(Conv2D(32, (3, 3), activation='relu', # 添加Conv2D层
    input_shape=(28,28,1))) # 指定输入数据样本张量的类型
model.add(MaxPooling2D(pool_size=(2, 2))) # 添加MaxPooling2D层
model.add(Conv2D(64, (3, 3), activation='relu')) # 添加Conv2D层
model.add(Dropout(0.25)) # 添加Dropout层
model.add(Flatten()) # 展平
model.add(Dense(128, activation='relu')) # 添加全连接层
model.add(Dropout(0.5)) # 添加Dropout层
model.add(Dense(10, activation='softmax')) # Softmax分类激活,输出10维分类码
model.compile(optimizer='rmsprop', # 指定优化器
    loss='categorical_crossentropy', # 指定损失函数
    metrics=['accuracy']) # 指定验证过程中的评估指标

训练参数

model.fit(x_train_ex, y_train_ex, # 指定训练特征集和训练标签集
    validation_split = 0.3, # 部分训练集数据拆分成验证集
    epochs=5, # 训练轮次为5轮
    batch_size=128) # 以128为批量进行训练

评估准确率

score = model.evaluate(x_test_ex, y_test_ex)
print('测试集预测准确率:', score[1]) # 打印测试集上的预测准确率
输出:
测试集预测准确率: 0.9818000197410583

挑一个看看效果

pred = model.predict(x_test_ex[0].reshape(1, 28, 28, 1)) # 预测测试集第一个数据
print(pred[0],"转换一下格式得到:",pred.argmax()) # 把one-hot码转换为数字
输出:
[2.8062285e-14 1.1196759e-10 6.9775169e-08 3.1157941e-07 7.0601281e-12
 3.3499530e-14 3.2120821e-15 9.9999964e-01 2.8983566e-11 2.0644549e-08] 转换一下格式得到: 7

import matplotlib.pyplot as plt # 导入绘图工具包
plt.imshow(x_test_ex[0].reshape(28, 28),cmap='Greys') # 输出这个图片
plt.show()

保存模型

from keras.models import save_model
import numpy as np
save_model(model,"mnist.model")

发现被保存在python的安装目录了,生成了一个文件夹 mnist.model

读取模型

重新开一个项目,尝试读取模型,并识别一个测试数据

from keras.models import load_model
model = load_model("mnist.model")
path = "D:\Program Files\Python\Lib\site-packages\keras\datasets\mnist.npz"

接下来读数据,去选择数据验证,和前面的代码差不多,就不写了。

posted @ 2021-03-01 17:51  哆啦梦乐园  阅读(813)  评论(0编辑  收藏  举报