[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"
接下来读数据,去选择数据验证,和前面的代码差不多,就不写了。
附记:在茫茫的信息海洋中,遇到就是有缘,期待回复交流,为缘分留下痕迹……