利用keras 实现cnn模型,关键在于:
(1)原始数据的处理。(可输入的格式)
(2)卷积层、池化层、全连接层的搭建
(3)各层对输入数据的size变化。
1.库的导入
np_utils库中的功能,应该就是对label进行one-hot处理一类的操作。
from models import Sequential 是keras搭建模型的一种框架,Sequential是一系列网络层按顺序构成的栈。
将一些网络层通过.add()堆叠起来,就构成了一个模型。
from models.layers import dense, activation, convolution2D, maxpooling2d, flatten 是导入的模型中的各个网络层。
dense:全连接神经网络层;
activation:激活函数;
convolution2D:卷积层
maxpooling2D:池化层
Flatten:用于数据的多维转换为一维,实现卷积层到全连接层的转换。
optimizer是模型的优化器,不同的优化器主要是在对学习率上的处理有所不同。
2.输入数据的处理
训练集的输入格式是600002828,是指一共60000个样本,每个样本是2828的像素图。由于数据是黑白数据,因此没有RGB的维度。
因为CNN模型的标准格式是出入长宽*高,高其实就是图像的颜色,改数据中没有高这一维度,所以要通过reshape增加一个维度。
缺少RGB的维度,因此在原数据的样本数之后添加了色彩维度,由于是黑白图片,该维度为1。其实就是高度为1。
除以255,是为了归一化。其实还有其他的方法,进行归一化。
3.模型搭建
model=Sequential()就是使用keras框架的方便之处,通过add的方式将网络的各个层加起来,后面只需针对各个层进行设计,最终通过add构建模型。
第一个卷积层:
卷积层中最重要的就是滤波器(filter),通过使用filter对原始数据进行特征提取。所以在卷积层中,就是对filter设计,分别有个数,尺寸,和padding。一般filter的尺寸为33或者55。个数由少到多,成倍增加。
该案例中,filter的个数为32,尺寸为5*5。
激活函数
卷积层后添加激活函数。激活函数有很多种,包括sigmoid,tanh。。。
池化层
池化层主要对卷积层提取的数据进行特征简化,其中包括最大池化,和平均池化。经过一次池化,原本的数据尺寸长宽都会减少一半。本案例中,经过第一次池化,长宽由2828变为1414。
第二层卷积层、激活函数、池化层。
铺平
特征提取之后,需要输入全连接层。但是,由于卷积之后的得到是多维图像(由于多个filter,有多少个filter就有多少个图片),无法直接输出至全连接层dense,因此中间需要flatten将得到的多个特征图进行铺平。
全连接层
最后通过全连接层对提取的特征进行一个特征降维吧,然后输出类别个数。
优化器
最后将优化器定义,其实就是定义学习率。
模型编译
设计模型的损失函数,该案例的损失函数为categorical_crossentropy(交叉熵损失函数),多分类中就是用交叉熵损失函数。