一. 进行数据预处理
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 = shape(X_train.shape[0], 28, 28, 1).astype('float32')
X_test = shape(X_test.shape[0], 1, 28, 28).astype('float32')
将fetures(数字图像特征值)转换(reshape)为6000 x 28 x 28 x 1的四维矩阵
CNN的输入是4维的张量(可看做多维向量),第一维是样本规模(图像数量),第四维是像素通道(这里为1通道,单),第二维和第三维是长度和宽度。并将数值归一化和类别标签向量化。
二. 建立模型
1.导入所需模块
dels import Sequential
from keras.layers 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(函数型模型)。
函数模型通过一系列过程调用来完成任务
序列模型在dels模块内实现,提供了模型的保存和重新加载功能,方便中断和重新开始一个训练过程。
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加入模型中。
第二次卷积,将16个图像转为36个图像,卷积运算并不改变图像,图像大小仍是14×14。
model.add(Conv2D(filters=36,
kernel_size=(5,5),
padding='same',
activation='relu’))
建立池化层2,加入Dropout避免过度拟合
model.add(MaxPooling2D(pool_size=(2, 2)))
采用maxPooling2D最大值的池,池大小为2×2。进行第二次缩减采样后,把36个14×14
的图像缩小为36个7×7的图像。
model.add(Dropout(0.25)) 使用dropout,称为Dropout的正则化层。每次训练迭代时,随机放弃25%的神经元,以减少过度拟合。
5.建立神经网络(平坦层、隐藏层、输出层)
建立平坦层 将输入“压平”,即把多维输入一维化,用在从卷积层到全连接层的过渡
model.add(Flatten()) 将二维矩阵数据转换为矢量(一维)。把36个7×7的图像转换为一维向量。长度是36×7×7=1764,即1764个浮点数,对应1764个神经元。
建立隐藏层
model.add(Dense(128, activation=‘relu’)) 共128个神经元。
model.add(Dropout(0.5)) 每次训练迭代时,随机放弃50%的神经元,以减少过拟合。
建立输出层
model.add(Dense(10,activation=‘softmax’))
有10个神经元(对应0--9)用于区别10个类,使用softmax激活函数进行转换。可将神经元的输出转换为预测每个数字的概率。Dense表示全连接。Dense含义是这里的神经元连接非常“稠密”。
6.查看模型的摘要
print(model.summary())
三. 进行训练
建立好模型后,就可利用反向传播算法进行训练。
1.定义训练方式
训练前,要用compile方法设置训练模型:
modelpile(loss='categorical_crossentropy',
optimizer='adam',metrics=['accuracy'])
Compile方法定义了三个参数:loss、adam、metrics。
loss :指定损失函数,在多分类任务中指定交叉熵为损失函数。
Optimizer :指定优化方法,可选 adam 方法,使训练更快收敛,提高准确率。
Optimizer :指定优化方法,可选 adam 方法,使训练更快收敛,提高准确率。
Metrics:模型观测参数(指标列表 ) 。包含评估模型训练和测试性能的指标,典型用法是metrics=[‘accuracy‘]。指标可是一个预定义指标的名字,也可是一个用户定制的函数。指标函
数应返回单个张量,或一个完成metric_name - > metric_value映射的字典。 metrics是为了直观地了解算法的效果,充当view的作用,并不参与到优化过程。
2.开始训练
train_history=model.fit(x=x_Train4D_normalize,
y=y_TrainOneHot,validation_split=0.2,
epochs=10, batch_size=300,verbose=2)
使用model.fit进行训练。前两个参数传入训练样本和它们的标记。训练过程存储在train_history变量中,需输入以下参数:
(1)输入训练数据参数
x=x_Train4D_normalize(features,数字图像的特征值)
y=y_TrainOneHot(label ,数字图像的真实值)
(2)设置训练与验证数据比例
validation_split=0.2 80%做训练数据,20%做验证数据。
(3)设置epochs(训练周期)次数与每一批次项数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论