欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

手写体数字识别例程——LeNet-5模型

程序员文章站 2024-03-14 11:06:16
...
   上一篇博客中介绍了Caffe环境的搭建,本片博客中介绍一下,在caffe中训练的第一个CNN模型LeNet-5。如果存在不正确的地方欢迎指正。
   该例程用的数据集是MNIST,该数据集中包含60000个训练集和10000个测试集。使用的CNN模型是LeNet-5网络模型,该模型包含2个卷积层,两个下采样层和两个全连接层。
   本文第一部分介绍,在Ubuntu 14.04系统下,如何训练LeNet-5模型。第二部分介绍该模型的prototxt文件。第三部分介绍训练日志中的一些信息及一些卷积的输入输出对照关系。

Caffe中训练LeNet-5的方法

1、获取mnist数据集
在caffe目录下,执行data/mnist/ 目录下的get_mnist.sh

./data/mnist/get_mnist.sh

执行之后,查看该目录可以看到该目录下增加了四个文件:
手写体数字识别例程——LeNet-5模型
从命名方式上可以看出,四个文件分别为测试集的图片和标签,训练集的图片和标签。

2、把数据转换成leveldb格式
下载的数据集是二进制格式,需要转换为LEVEDB或者LMDB才能被caffe识别,需要进行数据格式转换。

./example/mnist/create_mnist.sh

3、训练网络

./example/mnist/train_lenet.sh

查看prototxt文件

  • 查看训练的配置文件
vi examples/mnist/lenet_sover.prototxt

手写体数字识别例程——LeNet-5模型

该文件是对训练过程的一个描述。
net :给出了网络模型的路径
test_iter: 是预测阶段的迭代次数;在MNIST例程中,预测的样本组(test batch)大小为100;因此预测迭代次数设置为100,刚好覆盖预测数据集(10000)。
接下来的三个参数分别为:网络的基础学习速率、冲量和权衰量。
接下来的三个参量描述了学习速率的衰减策略
display:表示没经过多少次迭代,在屏幕上打印一次运行log;该文件中定义为100次迭代打印一次。
max_iter:最大迭代次数
接下来两个参数,每5000次迭代打印一次快照
solver_mode表示采用CPU还是GPU进行训练,本文采用CPU

  • 查看模型文件
    手写体数字识别例程——LeNet-5模型

程序比较长,分段截图;这是第一段,程序分为3部分,第一部分为name,接下来的两部分是两个layer;两个layer中的type参数说明了,这是两个数据层;phase参数,说明了,第一个layer是训练时候用的,第二个layer是测试的时候用的。data_param中的参数说明了数据来源、数据大小、数据格式。top表示输出,两个layer均有两个输出,数据及标签。

手写体数字识别例程——LeNet-5模型

第二部分包含两个layer,从name就很好区分,一个为卷积层1,一个为下采样层1. bottom:输入数据;top:输出数据。
convolution_param中是对卷积的描述:输出大小为20;kernelsize 5;stride=1;
xavier是权值填充器,在深度学习模型中,权值初始化的太小,信号在每层见传递时,将会逐渐缩小,难以产生作用;初始化的太大,会逐渐增大,最后失效;xavier是让权值不大不小,符合某种分布。
weigth_filler:权值
bias_filler:偏置

采样层相对简单:
pool给出了采样策略:max表示最大值采样
输入:conv1,卷积层1的输出是下采样层1的输入;
kernel大小为2*2
stride:步长为2

手写体数字识别例程——LeNet-5模型

这部分与上一部分一样,是一个卷积层一个下采样层;conv2的输入是pool1的输出;pool2的输入是conv2的输出;

conv2输出的通道数的大小变了,变为50;其他没有变化。

手写体数字识别例程——LeNet-5模型

这部分是两个layer,一个全连接层,一个Relu层;从参数上看,跟前面的层都一样;

手写体数字识别例程——LeNet-5模型

最后是全连接层2,Relu层2;和一个分类准确率层和损失层。
分类准确率层在test阶段有效,用于计算分类准确率;

关于各层的功能,会在下一篇博客中介绍;

训练日志简介

首先给出训练日志保存的方法

./examples/mnist/train_lenet.sh 2>&1 | tee ./train_log.log

这是重定向中的一些用法;

只截取日志的一部分进行说明

手写体数字识别例程——LeNet-5模型

这是日志的起始位置,可以看到日志输出的是一些训练的配置参数;
之后会输出训练的网络模型;

手写体数字识别例程——LeNet-5模型

看图中黄颜色的部分可以看到,分别是每一层的创建,输入输出,输出的大小,以及接下来链接的情况;

其他位置,是内存的占用情况等;

输出大小为: K C W H
K表示输入图片的通道数;
C表示kernel的通道数;
W H分别表示图片的宽和高;

接下来会看到下图的信息:
手写体数字识别例程——LeNet-5模型

可以看到,这些层都是需要反向传播的;
接下来看到的是一个前向预测的模型(查看数据层中的phase参数)
可以看到训练和预测输出的尺寸是不一样的;而且预测增加了准确率层。
之后描述了预测模型各层的输入输出信息等等,与训练模型类似,但是有些差别。

再往下看,训练和预测模型确定好了,就开始进行训练和预测:

手写体数字识别例程——LeNet-5模型

看图,黄色字体前面是预测模型建立完成后;前三句黄色语句,是表示开始进行训练和预测了;接下来的两条黄色字体可以看出:没有训练,直接进行了一次预测,预测的结果可想而知,accuracy为0.071;
接下来的黄色语句:
一共是5条train之后,可以看到第二次预测,accuracy为0.9754.
可以看到准确率已经很高了。

之后进行了很多次的训练和预测,最终的结果为:
手写体数字识别例程——LeNet-5模型
可以看到,预测的准确率达到0.9912

预测 = 前向传播

训练 = 前向传播+反向传播

刚开是学习,很多原理性的东西不是很明白,本文只是简单介绍了一些现象。下一篇博文讲介绍各个层的作用,以及各层输入输出的计算。

有错误的地方欢迎指正,共同学习,共同进步!

相关标签: caffe学习 lenet-5