提示:本文包含手写数字识别的程序分析和完整代码展示
文章目录
- 手写数字识别基础说明
- 数字识别程序分析
- 1、引入数据集
- 2、查看数据集
- 3、构建网络
- 4、网络的编译
- 5、准备图像数据和标签数据
- 6、训练网络并输出训练结果
- 初级完整代码
手写数字识别基础说明
本文是使用python语言编写,并使用了keras库。
要解决的问题:识别28像素*28像素的手写数字灰色图像,并将其划分到0—9这十个类别中。
数据集是:MNIST数据集,包含60 000张训练图像和10 000张测试图像。
用MNIST进行数字识别对于深度学习 相当于 python里“Hello World”
数字识别程序分析
1、引入数据集
mnist数据集已经嵌入到keras库里面了
train_images, train_labels, test_images, test_labels分别表示训练集,训练标签,测试集,测试标签。
from keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
2、查看数据集
此处说明了训练集图像的像素大小和训练集样本个数
>>> train_images.shape
(60000, 28, 28)
>>> len(train_labels)
60000
3、构建网络
神经网络的核心是层,,每个层相当于一个过滤器,网络模式是简单的把个个层连接起来,通过各个层把原始数据依次处理。
网络添加了 2 个 Dense 层,它们是密集连接层,也叫全连接层。第二层个Dense层是一个包含10个输出的softmax 层,它将返回一个由 10 个概率值组成的数组,且各个概率之和为1。
这10个概率值分别对应这0到9这10个数值
from keras import models
from keras import layers
network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))
4、网络的编译
要训练网络,还需要设置编译参数(compile)。
1、损失函数(loss function):衡量输出结果与预期结果差异大小;
2、优化器(optimizer):基于训练数据和损失函数来更新网络的机制;
3、在训练和测试过程中监控的指标(metric)。
network.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
5、准备图像数据和标签数据
预处理图像数据,将其转换为网络能处理的数值为0到1之间的浮点数
# 图像数据
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255
# 标签数据
from keras.utils import to_categorical
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
6、训练网络并输出训练结果
# 训练网络
network.fit(train_images, train_labels, epochs=5, batch_size=128)
# 输出训练测试结果
test_loss, test_acc = network.evaluate(test_images, test_labels)
print('test_acc:', test_acc)
让训练模型输出训练结果得0.989,测试结果test_acc: 0.9785
我们可以看出这两个结果之间是有差异的,原因是模型得过拟合。不过模型稍加训练,整体的精确度还是蛮高的。
这也就是模型简单得构建和训练过程。
初级完整代码
from keras.datasets import mnist
from keras import models
from keras import layers
from keras.utils import to_categorical
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))
# 网络编译
network.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 图像数据
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255
# 标签数据
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
# 训练网络
network.fit(train_images, train_labels, epochs=5, batch_size=128)
# 输出训练测试结果
test_loss, test_acc = network.evaluate(test_images, test_labels)
print('test_acc:', test_acc)