利⽤全连接神经⽹络实现⼿写数字识别-使⽤Python语⾔,Keras框架
1.问题描述?
本⽂要解决的问题是⼿写数字识别。使⽤的数据集为:。
我们需要让计算机识别图⽚中的⼿写数字是多少。
这个问题对于我们⼈类来说⾮常简单,⼀眼就看出来图⽚中的数字是⼏了。 但是对于机器来说却很难,因为机器从⼀张图⽚中看到的是⼀堆没啥意义的数字。
2.解决思路?
那如何让计算机认出图⽚中的数字是⼏呢?
在计算机中,图⽚是由多个像素组成的。如果图⽚是灰度图则每个像素由8位⼆进制组成。
如果图⽚是彩⾊图⽚,则每个像素由三个8位⼆进制表⽰(分别表⽰红、绿、蓝三种颜⾊的值)。
虽然单个像素不能表达任何信息,但是把多个像素连在⼀起,不同数字的图⽚就有不同的特征了。 ⽐如,下⾯这张图⽚。
乍⼀看,我们可能看不出来图⽚表⽰什么。但是如果我们把不是0的部分都加上阴影,数字越⼤阴影越深。
你就能看出来上⾯的图⽚代表数字4了。
计算机可以采⽤同样的原理。⼀个像素代表不了什么,但是多个像素组合起来,就能表⽰出不同数字的特征了。 依据这些特征,就可以识别出图⽚中代表的数字了。
3.模型架构?
本⽂将采全连接⽹络来实现⼿写数字的识别。整个⽹络包含两个 、 两个 和⼀个输出层。
因为输出的结果为0-9数字中的⼀个,⼀共包含10类。因此使⽤输出图⽚对于每种类别的概率。
4.⼯具包说明?
import keras
validation框架from keras.datasets import mnist
dels import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop
1). ⾸先导⼊keras核⼼类库
2). 接着导⼊keras⾃带的数据⼯具类mnist,该类会从下载mnist数据集()。
3). 然后导⼊线性模型构造器(也叫贯穿模型Sequential,⽤来构造简单的流⽔线式机器学习模型)
4). 之后导⼊全连接层Dense和Dropout层Dropout
5). 最后导⼊模型优化器RMSprop,Keras会通过优化器来更新参数,优化模型。
5.定义全局变量?
batch_size = 128
num_classes = 10
epochs = 20
1). 设置每批处理的样本数量,本例中每批随机抽泣128个样本进⾏处理
2). 设置总分类数,本例会将图⽚分为0-9,共10个类别
3). 设置训练轮数,本例总总共训练20轮,即所有样本都会被重复训练20次
6.加载数据?
(x_train, y_train), (x_test, y_test) = mnist.load_data()
1). 通过keras⾃带的mnist⼯具包加载数据
2). 加载出的数据分成两部分,训练数据集(60000张图⽚)和测试数据集(10000张图⽚)
3). 每个数据集中⼜包含样本特征和样本标签两个部分
4). 样本特征为图⽚的像素数据,每张图⽚有28*28共784个像素组成
5). 样本标签为图⽚上对应的真实数字
keras会总动从amazonaws下载数据集,如果下载失败请参考
7.设置数据形状?
x_train = shape(60000, 784)
x_test = shape(10000, 784)
1). 将训练样本集的特征数据,变成60000⾏784列(28*28)
2). 将测试样本集的特征数据,变成10000⾏784列
3). 转化后,样本集中的每⼀⾏都代表⼀个样本,每个样本有784个特征(784个像素)
如果是⼿⼯下载的数据集,数据集本⾝已经做过形状处理了,⽆需本步操作
8.设置数据类型?
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
将特征数据强制转化成float32类型,⽅便tensorflow等框架的处理
如果是⼿⼯下载的数据集,数据类型已经转化过了,⽆需本步操作
9.数据归⼀化?
x_train /= 255
x_test /= 255
1). 因为每个像素都是⽤8位⼆进制表⽰的,因此最⼤值为255
2). 特征数据除以255后,其值缩⼩到0-1范围内了,此操作称作
3). 数据归⼀化后,可以加速模型收敛,提升训练速度
如果是⼿⼯下载的数据集,数据已经归⼀化了,⽆需本步操作
10.将标签转化成one-hot形式?
y_train = _categorical(y_train, num_classes)
y_test = _categorical(y_test, num_classes)
1). ⽬前样本标签为1、2、3……等⾃然数
2). SoftMax分类输出的结果为各个类别的概率,⽽不是1、2、3……等⾃然数
3). 因此需要将样本标签转化成向量,样本标签对应的元素为1,其他元素为0。
转化后,训练样本集的标签数据将包含60000⾏10列,每⾏为1个样本标签,样本标签为⼀个向量,向量中值为1的元素索引就是图⽚对应的数字。
11.构建模型?
model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(num_classes, activation='softmax'))
1). ⾸先通过线性模型构造器,创建⼀个模型model
2). 接着向模型中添加⼀个全连接层Dense,该层包含512个神经元、激活函数为relu,输⼊样本的形状为(784,)
3). 然后向模型中添加⼀个Dropout层,该层会随机丢弃20%神经元(随机将20%神经元的输出强制清零)
4). 然后再向模型中添加⼀个全连接层Dense,该层包含512个神经元、激活函数为relu
5). 之后再向模型中添加⼀个Dropout层,该层会随机丢弃20%神经元(随机将20%神经元的输出强制清零)
6). 最后向模型中添加⼀个全连接层⽤作输出,该层神经元的数量与分类数量⼀致,使⽤的激活函数为SoftMax,来输出样本属于各个类别的概率。
12.输出模型结构?
model.summary()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论