奔跑吧Caffe(在MNIST手写体数字集上用Caffe框架训练LeNet模型)

数据集背景:

MNIST 是一个大型的手写体数字数据库,广泛应用于机器学习领域的训练和测试,由纽约大学Yann LeCun教授整理。

MNIST包括60000个训练集和10000测试集,图片固定尺寸为28*28。

LeNet模型背景:

LeNet是1986提出的,是最简单的CNN(卷积神经网路)模型,也是Caffe自带的第一个小例子用到模型。


所以综上,不难看出【在MNIST手写体数据集上用Caffe框架训练LeNet模型】简直就是深度学习届的helloworld啊哈哈哈

废话说完,看下Caffe官方给出的第一个小例子是怎么跑起来的。


第一步:下载MNIST数据集

大Caffe已经给我们写好了下载脚本,直接执行就是:

1
sudo  sh data /mnist/get_mnist .sh

当然可以用Vim打开看一下啦,主要是一些wget下载命令和gunzip解压命令啦O(∩_∩)O~

运行成功后,在 data/mnist/目录下多出了四个文件,这四个文件便是MNIST原始数据文件啦。

train-images-idx3-ubyte:  训练集样本 (9912422 bytes) 

train-labels-idx1-ubyte:  训练集对应标注 (28881 bytes) 

t10k-images-idx3-ubyte:   测试集图片 (1648877 bytes) 

t10k-labels-idx1-ubyte:   测试集对应标注 (4542 bytes)


第二步:数据格式转换

当然上面的原始数据格式为二进制文件,是不能在caffe中直接使用的,需要转换成Caffe可以识别的格式LMDB或者LEVELDB才行。

继续执行脚本咯:

1
sudo  sh examples /mnist/create_mnist .sh

如果想运行leveldb数据,请运行 examples/siamese/ 文件夹下面的程序,examples/mnist/ 文件夹是运行lmdb数据。两个都可以,反正当初在搭建环境的时候,这两个依赖包都安装过了。转换成功后,会在 examples/mnist/目录下,生成两个文件夹,分别是mnist_train_lmdb(训练集)和mnist_test_lmdb(测试集),里面存放的data.mdb和lock.mdb,就是我们需要的运行数据。

PS:至于为什么不直接读取原始数据,非要采用LMDB、LEVELDB呢?主要有两个原因:

1、原始数据类型多种多样,不可能用一套代码来搞定,转换是为了更好的统一,以简化读取层的实现;

2、使用LMDB、LEVELDB可以提高磁盘IO利用率。


第三步:开始训练模型

一切准备就绪后,开始训练。依然范特。。不对,依然脚本伺候:

1
sudo  sh examples /mnist/train_lenet .sh

等下,本宝热爱学习,我想看下脚本里面写的什么,用vi打开后发现:

1
2
#!/usr/bin/env sh
. /build/tools/caffe  train --solver=examples /mnist/lenet_solver .prototxt

可见啊,该脚本是调用了前面编译好的build/tools/caffe.bin二进制文件,参数--solver=examples/mnist/lenet_solver.prototxt  则是指定了训练超参数文件文件。

打开它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# The train/test net protocol buffer definition   // 参数描述文件
net:  "examples/mnist/lenet_train_test.prototxt"    // 位置
# test_iter specifies how many forward passes the test should carry out. 
# In the case of MNIST, we have test batch size 100 and 100 test iterations,
# covering the full 10,000 testing images. // 一共10000张测试图像,test batch size 100 每次测试处理100张
test_iter: 100   //  进行100次前向计算,test_iter* test  batch size =10000
# Carry out testing every 500 training iterations.
test_interval: 500  //  每训练500次,进行一次测试
# The base learning rate, momentum and the weight decay of the network.
base_lr: 0.01   // 基础学习率
momentum: 0.9   // 学习率 改变的动量
weight_decay: 0.0005  // 学习率衰减系数
# The learning rate policy  //学习策略 及相关参数
lr_policy:  "inv"
gamma: 0.0001
power: 0.75
# Display every 100 iterations
display: 100    // 迭代100次 打印输出一次结果
# The maximum number of iterations
max_iter: 10000    // 最大迭代数
# snapshot intermediate results
snapshot: 5000      //5000 次迭代保存一次临时模型,名称为lenet_iter_5000.caffemodel
snapshot_prefix:  "examples/mnist/lenet"
# solver mode: CPU or GPU // 使用CPU还是GPU
solver_mode: GPU    // 打开GPU

根据参数的意思再结合自己的情况,修改之。尤其是最后一句,如果没有显卡就老老实实的修改成CPU模式吧。

终于可以训练了,好鸡动:

1
sudo  sh examples /mnist/train_lenet .sh

大概20分钟吧,时间会给你好味道O(∩_∩)O~


第四步:用训练好的模型对数据进行预测

最终训练好的模型的权值保存在 examples/mnist/lenet_iter_10000.caffemodel 文件中,训练状态保存在 examples/mnist/lenet_iter_10000.solverstate 文件中。

下面开始利用训练好的LeNet模型权值文件对测试集进行预测:

1
2
3
4
. /build/tools/caffe  test 
-model examples /mnist/lenet_train_test .prototxt 
-weights examples /mnist/lenet_iter_10000 .caffemodel 
-iterations 100

OK,静等实验结果吧,最终识别率为99%。


总结:通过跑Caffe自带的这个小例子让我大致了解了Caffe的工作流程。




参考资料:

1、http://blog.csdn.net/wangchuansnnu/article/details/44341753

2、http://www.cnblogs.com/denny402/p/5075490.html

3、http://caffe.berkeleyvision.org/gathered/examples/mnist.html

4、http://blog.csdn.net/xbinworld/article/details/45619685

5、《深度学习-21天实战Caffe》 赵永科


你可能感兴趣的:(深度学习)