提示:本文包含手写数字识别的程序分析和完整代码展示


文章目录

  • 手写数字识别基础说明
  • 数字识别程序分析
  • 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)