手写数字识别代码解释
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一. 进行数据预处理
1导入相关库
from keras.datasets import mnist 从keras的datasets中导入mnist数据集
from keras.utils import np_utils 从keras导入将整型标签转换方法utils
import numpy as np 导入Python扩充程序库numPy,作为np调用。numPy支持大量的维度数组与矩阵运算,也针对数组运算提供大量的数学函数库。
np.random.seed(10)
设置随机数种子为10 。将随机数发生器初始化为恒定值,以获得可重复结果。
2.读取MNIST数据
(X_train, y_train), (X_test, y_test) = mnist.load_data()
返回手写图片的两个tuple,第一个tuple存储已经人工分类好的图片及标签,标签指出该图片表示的数字(0—9),供训练使用;第二个tuple存储未分类的图片,在用第一个tuple 训练完后,可以对第二个tuple利用神经网络进行分类,根据实验结果的真实值与预测值对比得到相应的损失值,再利用反向传播进行参数更新,再进行分类,然后重复前述步骤直至损失值最小。
元组不能修改
reshape to be [samples][pixels][width][height]
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32')
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28).astype('float32')
将fetures(数字图像特征值)转换(reshape)为6000 x 28 x 28 x 1的四维矩阵
CNN的输入是4维的张量(可看做多维向量),第一维是样本规模(图像数量),第四维是像素通道(这里为1通道,单色),第二维和第三维是长度和宽度。并将数值归一化和类别标签向量化。
二. 建立模型
1.导入所需模块
from keras.models import Sequential
from yers import Dense,Dropout,Flatten,Conv2D,MaxPooling2D
2.建立keras的Sequential模型--多个网络层的线性堆叠
model = Sequential() 两种建模方式:向layer添加list的方式;通过.add()方式一层层添加(一个add为一层)
3.建立卷积层1 与池化层1
建立卷积层1
卷积层1对手写数字图像以16个滤镜(卷积核)进行分解,分别侧重于同一张图片中不同的特征。把Conv2D加入模型中。model.add(Sequential是模型的添加层方法,加一个神经网络层到模型中)
In[9] model.add(Conv2D(filters=16, 输入图像大小为28×28,16个核。进行第一次卷积产生16个图像,卷积运算并不改变图像,图像大小仍是28×28
kernel_size=(5,5), 卷积核5×5
padding='same’,
注释:keras提供的两种神经网络模型
一.Sequential(序列型)模型。把一些基础神经网络层组件一个个串联起来形成一个完整的模型,在此模型上进行训练,从而完成学习任务。序列模型可看做面向对象的方法,一系列对象协作完成任务。
二.Functional(函数型模型)。
函数模型通过一系列过程调用来完成任务
序列模型在keras.models模块内实现,提供了模型的保存和重新加载功能,方便中断和重新开始一个训练过程。
save_model(model,path);load_model(path)
Sequential类
add(layer) 向链尾追加一层神经网络层
pop() 删除尾部的神经网络层
compile(optimizer,loss,metrics) 配置模型的训练参数
Padding是边缘填充:卷积前,先将图片扩大一点,再进行卷积。对于扩大部分,一般会填入0值,即在输入矩阵的边缘填补一圈0。podding=‘SAME’时,全0填充。
input_shape=(28,28,1),张量的形状称为shape,表示多少维,平面还是立体
activation=‘relu’)) 激活函数
数据以张量形式表示,张量的形状称为shape。表示从最外层向量逐步到达最底层向量的降维解包过程。如,一阶张量[1,2,3]的shape是(3,); 二阶的张量[[1,2,3],[4,5,6]]的shape是(2,3);三阶张量[[[1],[2],[3]],[[4],[5],[6]]]的shape是(2,3,1)。input_shape指输入张量的shape。例如,input_dim=784,说明输入是一个784维的向量,这相当于一个一阶的张量,它的shape是(784,)。因此,input_shape=(784,)。
建立池化层1(亚采样或下采样)
池化层1将分解得到的16张图片中与识别无关的信息切除。降低了每个特征映射的维度,保留了最重要的信息。
In[10]: model.add(MaxPooling2D(pool_size=(2, 2)))
采用maxPooling2D最大值的池,池大小为2×2。进行第一次缩减采样后,把16个28×28 的图像缩小为16个14×14的图像,直观看将图片切掉了1/2大小。
建立卷积层2
卷积层2和池化层2做的工作相似。把Conv2D加入模型中。