写在前面
本篇文章主要通过MNIST手写字符集的识别实例,来利用Keras搭建一个速度快,准确率高的DCNN(LeNet)网络。同时需要对比用TensorFlow搭建的普通CNN识别数字0和1,来比较这两个实验的结果。
关于Keras
关于Keras的内容请参考笔者之前的总结:是大家:Keras入门
安装keras,请先安装TensorFlow,关于TensorFlow的安装请参考:是大家:在MAC上安装TensorFlow
安装Anaconda后,在终端执行:
source activate tensorflow
pip install keras
关于CNN
笔者之前总结的CNN:是大家:CNN卷积神经网络
DCNN(Deep CNN)
由Yann le Cun提出的一个称为LeNet的卷积神经网络族群 (Convolution NetWorks for Images,Speech and Time-Series),用此来训练MNIST手写字符集的识别,它对简单几何变换和扭曲具有较好的鲁棒性。
这种网络的关键点在于让较低的网络层交替进行卷积和最大池化运算。
用keras构建LeNet
首先我们需要熟悉二维卷积模型,以此来定义LeNet代码:
keras.layers.convolutional.Conv2D(filters, Kernel_size, padding='valid')
这里的滤波器要使用的是卷积核心的数量。
- kernel_size是一个整数值或一个二维整形数组,声明了二维卷积窗的高度和宽度。
- padding=‘same’表示保留边界处的卷积结果。
此外,我们需要MaxPooling2D模块:
keras.layers.pooling.MaxPooling2D(pool_size=(2,2), strides(2,2))
- pool_size=(2,2)是一个二维数组,代表图像在水平和竖直两个方向上的采样因子。
- strides=(2,2)表示处理过程采用的步幅。
以下为代码部分:
from
代码的解释在注释中以及说明,请仔细看注释部分。
- 硬件设备
处理器:2.3 GHz Intel Core i5
内存:8 GB 2133 MHz LPDDR3
图型卡:Intel Iris Plus Graphics 640 1536 MB
backend:TensorFlow
- 运行时间
每次迭代的时间消耗:1:05左右
共20次迭代,总耗时越20~30分钟
- 结果
Test score: 0.03838091508005468
Test accuracy: 0.9914
![83841e5803aa0a504782f3d8cf1e53a1.png](https://i-blog.csdnimg.cn/blog_migrate/9d2901f5f5287d15f16e91e2e946f759.jpeg)
![1cfe78892d59295d0d553f1142f6b0ad.png](https://i-blog.csdnimg.cn/blog_migrate/7d82b295a066781a5dc9052fdd19be47.jpeg)
总结
下面使用keras搭建的LeNet将和用TensorFlow实现0和1数字识别的CNN网络进行比较。
以下是用TensorFlow实现0和1数字识别的准确率:
![48062457d1e8104c2bd114814d0fd111.png](https://i-blog.csdnimg.cn/blog_migrate/aa74f71ffeb604acb943f1c8d498ddee.jpeg)
- 时间上,TensorFlow搭建的CNN识别0和1的效率偏低,在我的电脑上的运行时间接近1小时,且工作量小,图片库中训练集只有50张0和50张1的图片,测试集有10张0和10张1。而使用keras搭建的LeNet来识别0~9的数字笔迹,运行时间只要30分钟左右,且对0~9的数字都进行了学习,工作量为:Train on 48000 samples, validate on 12000 samples。
- 在准确率上,TensorFlow搭建的CNN识别0和1的准确率偏低,只有80%左右(时间比较久,所以笔者记得也不是很清楚来),且数据的波动较大。而而使用keras搭建的LeNet来识别0~9的数字笔迹准确率到达99.14%,这几乎比人为识别的准确率还要高上很多。
- 在代码量上,TensorFlow搭建的CNN的代码量要远大于使用keras搭建的LeNet的代码量。
PS:
TensorFlow识别0和1的方法如下:
- 先由图片生成TFRecord文件,以便后续训练过程使用。(调用OpenCV)
安装OpenCV
pip3 install opencv-python
- 构建卷积网络结构
![9f85a27838cc38f001bcd81ec758dc54.png](https://i-blog.csdnimg.cn/blog_migrate/1258708ad20e20c49c09411eb4c287af.jpeg)
- 训练
读取训练数据,经过前向计算过程得到1024个图片特征,再用这1024个图片特征经过两层全连接网络得到两个分类的值,然后用这两个值和样本标注的数据做softmax计算,得到损失值,接着用随机梯度下降优化算法,反向传播更新模型的参数。
不断重复上述过程,直到损失值很小或者测试数据的准确率达到某个值。
具体代码请看:TensorFlow入门(代码)第五章
在浏览器中使用TensorBoard打开结果查看,在terminal输入:
tensorboard --logdir=./event
PS:建议搭配《TensorFlow入门与实战》一起食用
补充
几种经典的卷积神经网络
- AlexNet
- VGGNet
- Inception Net
- ResNet
按照顺序,它们分别获得了ILSVRC比赛分类项目的2012冠军,2014亚军,2014冠军和2015冠军。
这里引用百度百科和其他人的博客,如果有时间笔者会进行重新修改补充。
Reference
Deep Learning with Keras (by Antonio Gulli & Sujit Pal)
《TensorFlow入门与实战》