Tensorflow2.0之Minist手写数字识别

本文介绍使用TensorFlow2.0构建三层神经网络识别MNIST手写数字的方法,详细阐述网络结构、数据预处理及训练过程,最终在测试集上获得87.25%的准确率。

Tensorflow2.0之Minist手写数字识别

注: 完整代码在最后

Minist数据集介绍

 Minist数据集是(Lecun, Bottou, Bengio, & Haffner, 1998)发布的,它包含了0~9 共10 种数字的手写图片,每种数字一共有7000 张图片,采集自不同书写风格的真实手写图片,一共70000 张图片。其中60000张图片作为训练集𝔻train^{train}train(Training Set),用来训练模型,剩下10000 张图片作为测试集𝔻test^{test}test(Test Set),用来预测或者测试,训练集和测试集共同组成了整个MNIST 数据集。

 考虑到手写数字图片包含的信息比较简单,每张图片均被缩放到28 × 28的大小,同时
只保留了灰度信息

 现在我们来看下图片的表示方法。一张图片包含了ℎ行(Height/Row),𝑤(Width/Column),每个位置保存了像素(Pixel)值,像素值一般使用0~255 的整形数值来表达颜色强度信息,例如0 表示强度最低,255 表示强度最高。如果是彩色图片,则每个像素点包含了R、G、B 三个通道的强度信息,分别代表红色通道、绿色通道、蓝色通道的颜色强度,所以与灰度图片不同,它的每个像素点使用一个1 维、长度为3 的向量(Vector)来表示,向量的3 个元素依次代表了当前像素点上面的R、G、B 颜色强值,因此彩色图片需要保存为形状是[ℎ, 𝑤, 3]的张量(Tensor,可以通俗地理解为3 维数组)。如果是灰度图片,则使用一个数值来表示灰度强度,例如0 表示纯黑,255 表示纯白,因此它只需要一个形状为[ℎ, 𝑤]的二维矩阵(Matrix)来表示一张图片信息(也可以保存为[ℎ, 𝑤, 1]形状的张量)。图 3.3 演示了内容为8 的数字图片的矩阵内容,可以看到,图片中黑色的像素用0 表示,灰度信息用0~255 表示,图片中灰度越白的像素点,对应矩阵位置中数值也就越大。

在这里插入图片描述

网络结构介绍

 本文中使用的简单的三层神经网络:
out=relu{  relu{  [X@W1+b1]@W2+b2} @W3+b3}  out=relu \{\ relu\{\ [X@W_1+b_1]@W_2+b_2\}\ @W_3+b_3 \}\ out=relu{  relu{  [X@W1+b1]@W2+b2} @W3+b3} 
 out 可以套上激活函数也可以不用套
 我们采用的数据集是MNIST 手写数字图片集,输入节点数为784,第一层的输出节点数是256,第二层的输出节点数是128,第三层的输出节点是10,也就是当前样本属于10 类别的概率。

代码部分

导入相应的包

from matplotlib import pyplot as mp
import tensorflow as tf
from tensorflow.keras import datasets, layers, optimizers

预处理函数

 从 keras.datasets 中加载的数据集的格式大部分情况都不能满足模型的输入要求,因此需要根据用户的逻辑自己实现预处理函数。Dataset 对象通过提供map(func)工具函数可以非常方便地调用用户自定义的预处理逻辑,它实现在func 函数里:

# 预处理函数实现在preprocess 函数中,传入函数引用即可
train_db = train_db.map(preprocess)

 考虑 MNIST 手写数字图片,从keras.datasets 中经.batch()后加载的图片x shape 为[𝑏, 28,28],像素使用0~255 的整形表示;标注shape 为[𝑏],即采样的数字编码方式。实际的神经网络输入,一般需要将图片数据标准化到[0,1]或[−1,1]等0 附近区间,同时根据网络的设置,需要将shape [28,28] 的输入Reshape 为合法的格式;对于标注信息,可以选择在预处理时进行one-hot 编码,也可以在计算误差时进行one-hot 编码。

 同时,我们将MNIST 图片数据映射到𝑥 ∈ [0,1]区间,视图调整为
[𝑏, 28 ∗ 28];对于标注y,我们选择在预处理函数里面进行one-hot 编码:

def preprocess(x, y): # 自定义的预处理函数
	# 调用此函数时会自动传入x,y 对象,shape 为[b, 28, 28], [b]
	# 标准化到0~1
	x = tf.cast(x, dtype=tf.float32) / 255.
	x = tf.reshape(x, [-1, 28*28]) # 打平
	y = tf.cast(y, dtype=tf.int32) # 转成整形张量
	y = tf.
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值