数据集背景:
MNIST 是一个大型的手写体数字数据库,广泛应用于机器学习领域的训练和测试,由纽约大学Yann LeCun教授整理。
MNIST包括60000个训练集和10000测试集,图片固定尺寸为28*28。
LeNet模型背景:
LeNet是1986提出的,是最简单的CNN(卷积神经网路)模型,也是Caffe自带的第一个小例子用到模型。
所以综上,不难看出【在MNIST手写体数据集上用Caffe框架训练LeNet模型】简直就是深度学习届的helloworld啊哈哈哈
废话说完,看下Caffe官方给出的第一个小例子是怎么跑起来的。
大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》 赵永科