一. 装完caffe当然要来跑跑自带的demo,在examples文件夹下。
先来试试用于手写数字识别的mnist,在 examples/mnist/ 下有需要的代码文件,但是没有图像库。
mnist库有50000个训练样本,10000个测试样本,都是手写数字图像。
caffe支持的数据格式为:lmdb leveldb
imdb比leveldb大,但是速度更快,且允许多种训练模型同时读取同一数据集。
默认情况,examples里支持的是imdb文件,不过你可以修改为leveldb,后面详解。
mnist数据集建议网上搜索下载,网盘有很多,注意将文件夹放到examplesmnist目录下,且最好命名为图中格式,
否则可能无法读取文件需手动配置。
笔者之前下的数据集命名的下划线是连接线就会报错无法读取文件,所以注意文件夹名字!
windows下最好选择leveldb文件,linux则随意了。下好了leveldb文件就不用再使用convert_imageset函数了,省去了转换图片格式和计算均值的步骤。
二. 训练mnist模型
mnist的网络训练模型文件为: lenet_train_test.prototxt
name: <span>"</span><span>lenet</span><span>"</span><span> layer {
name: </span><span>"</span><span>mnist</span><span>"</span><span> type: </span><span>"</span><span>data</span><span>"</span><span> top: </span><span>"</span><span>data</span><span>"</span><span> top: </span><span>"</span><span>label</span><span>"</span><span> include {
phase: train
}
transform_param {
scale: </span><span>0.00390625</span><span> }
data_param {
source: </span><span>"</span><span>examples/mnist/mnist_train_leveldb</span><span>"</span><span> batch_size: </span><span>64</span><span> backend: leveldb
}
}
layer {
name: </span><span>"</span><span>mnist</span><span>"</span><span> type: </span><span>"</span><span>data</span><span>"</span><span> top: </span><span>"</span><span>data</span><span>"</span><span> top: </span><span>"</span><span>label</span><span>"</span><span> include {
phase: test
}
transform_param {
scale: </span><span>0.00390625</span><span> }
data_param {
source: </span><span>"</span><span>examples/mnist/mnist_test_leveldb</span><span>"</span><span> batch_size: </span><span>100</span><span> backend: leveldb
}
}
layer {
name: </span><span>"</span><span>conv1</span><span>"</span><span> type: </span><span>"</span><span>convolution</span><span>"</span><span> bottom: </span><span>"</span><span>data</span><span>"</span><span> top: </span><span>"</span><span>conv1</span><span>"</span><span> param {
lr_mult: </span><span>1</span><span> }
param {
lr_mult: </span><span>2</span><span> }
convolution_param {
num_output: </span><span>20</span><span> kernel_size: </span><span>5</span><span> stride: </span><span>1</span><span> weight_filler {
type: </span><span>"</span><span>xavier</span><span>"</span><span> }
bias_filler {
type: </span><span>"</span><span>constant</span><span>"</span><span> }
}
}
layer {
name: </span><span>"</span><span>pool1</span><span>"</span><span> type: </span><span>"</span><span>pooling</span><span>"</span><span> bottom: </span><span>"</span><span>conv1</span><span>"</span><span> top: </span><span>"</span><span>pool1</span><span>"</span><span> pooling_param {
pool: max
kernel_size: </span><span>2</span><span> stride: </span><span>2</span><span> }
}
layer {
name: </span><span>"</span><span>conv2</span><span>"</span><span> type: </span><span>"</span><span>convolution</span><span>"</span><span> bottom: </span><span>"</span><span>pool1</span><span>"</span><span> top: </span><span>"</span><span>conv2</span><span>"</span><span> param {
lr_mult: </span><span>1</span><span> }
param {
lr_mult: </span><span>2</span><span> }
convolution_param {
num_output: </span><span>50</span><span> kernel_size: </span><span>5</span><span> stride: </span><span>1</span><span> weight_filler {
type: </span><span>"</span><span>xavier</span><span>"</span><span> }
bias_filler {
type: </span><span>"</span><span>constant</span><span>"</span><span> }
}
}
layer {
name: </span><span>"</span><span>pool2</span><span>"</span><span> type: </span><span>"</span><span>pooling</span><span>"</span><span> bottom: </span><span>"</span><span>conv2</span><span>"</span><span> top: </span><span>"</span><span>pool2</span><span>"</span><span> pooling_param {
pool: max
kernel_size: </span><span>2</span><span> stride: </span><span>2</span><span> }
}
layer {
name: </span><span>"</span><span>ip1</span><span>"</span><span> type: </span><span>"</span><span>innerproduct</span><span>"</span><span> bottom: </span><span>"</span><span>pool2</span><span>"</span><span> top: </span><span>"</span><span>ip1</span><span>"</span><span> param {
lr_mult: </span><span>1</span><span> }
param {
lr_mult: </span><span>2</span><span> }
inner_product_param {
num_output: </span><span>500</span><span> weight_filler {
type: </span><span>"</span><span>xavier</span><span>"</span><span> }
bias_filler {
type: </span><span>"</span><span>constant</span><span>"</span><span> }
}
}
layer {
name: </span><span>"</span><span>relu1</span><span>"</span><span> type: </span><span>"</span><span>relu</span><span>"</span><span> bottom: </span><span>"</span><span>ip1</span><span>"</span><span> top: </span><span>"</span><span>ip1</span><span>"</span><span> }
layer {
name: </span><span>"</span><span>ip2</span><span>"</span><span> type: </span><span>"</span><span>innerproduct</span><span>"</span><span> bottom: </span><span>"</span><span>ip1</span><span>"</span><span> top: </span><span>"</span><span>ip2</span><span>"</span><span> param {
lr_mult: </span><span>1</span><span> }
param {
lr_mult: </span><span>2</span><span> }
inner_product_param {
num_output: </span><span>10</span><span> weight_filler {
type: </span><span>"</span><span>xavier</span><span>"</span><span> }
bias_filler {
type: </span><span>"</span><span>constant</span><span>"</span><span> }
}
}
layer {
name: </span><span>"</span><span>accuracy</span><span>"</span><span> type: </span><span>"</span><span>accuracy</span><span>"</span><span> bottom: </span><span>"</span><span>ip2</span><span>"</span><span> bottom: </span><span>"</span><span>label</span><span>"</span><span> top: </span><span>"</span><span>accuracy</span><span>"</span><span> include {
phase: test
}
}
layer {
name: </span><span>"</span><span>loss</span><span>"</span><span> type: </span><span>"</span><span>softmaxwithloss</span><span>"</span><span> bottom: </span><span>"</span><span>ip2</span><span>"</span><span> bottom: </span><span>"</span><span>label</span><span>"</span><span> top: </span><span>"</span><span>loss</span><span>"</span><span> }</span> 一般修改两个data层的 “source”文件路径就行,上面的例子中,我已经改了,改为mnist的训练集和测试集文件夹路径。再就是注意“backend: leveldb”,默认的backend应该是imdb要修改!
网络模型 lenet_train_test.prototxt修改后再修改 lenet_solver.prototxt
该文件主要是一些学习参数和策略:
<span> 1</span> # the train/<span>test net protocol buffer definition</span><span> 2</span> net: <span>"</span><span>examples/mnist/lenet_train_test.prototxt</span><span>"</span><span> 3</span> # test_iter specifies how many forward passes the test should carry <span>out</span><span>.</span><span> 4</span> # in the <span>case</span> of mnist, we have test batch size <span>100</span> and <span>100</span><span> test iterations,</span><span> 5</span> # covering the full <span>10</span>,<span>000</span><span> testing images.</span><span> 6</span> test_iter: <span>100</span><span> 7</span> # carry <span>out</span> testing every <span>500</span><span> training iterations.</span><span> 8</span> test_interval: <span>500</span><span> 9</span> # the <span>base</span><span> learning rate, momentum and the weight decay of the network.</span><span>10</span> base_lr: <span>0.01</span><span>11</span> momentum: <span>0.9</span><span>12</span> weight_decay: <span>0.0005</span><span>13</span><span># the learning rate policy</span><span>14</span> lr_policy: <span>"</span><span>inv</span><span>"</span><span>15</span> gamma: <span>0.0001</span><span>16</span> power: <span>0.75</span><span>17</span> # display every <span>100</span><span> iterations</span><span>18</span> display: <span>100</span><span>19</span><span># the maximum number of iterations</span><span>20</span> max_iter: <span>10000</span><span>21</span><span># snapshot intermediate results</span><span>22</span> snapshot: <span>5000</span><span>23</span> snapshot_prefix: <span>"</span><span>examples/mnist/lenet</span><span>"</span><span>24</span><span># solver mode: cpu or gpu</span><span>25</span> solver_mode: cpu
带#的注释可以不管,能理解最好:
第二行的 net: 路径需改为自己的网络模型xx_train_test.prototxt路径。其他的学习率 base_lr,lr_policy等不建议修改;max_iter最大迭代次数可以稍微改小,display显示间隔也可以随意修改~最后一行,我是只有cpu模式所以设为cpu,如果可以用gpu加速可设为gpu!
到这基本设置就结束了,然后就是写命令执行测试程序了:
我选择写了批处理.bat文件执行,也可以直接在cmd环境输命令执行。
新建mnist_train.bat,内容如下:
cd ../../<span>"</span><span>build/x64/debug/caffe.exe</span><span>"</span> train --solver=examples/mnist/<span>lenet_solver.prototxt pause </span>
根据自己的情况修改第二行的路径位置,windows应该都是在build/x64目录下,有的博客写的/bin/目录其实是linux的并不适用于windows环境。还要注意使用斜线“/”,不要使用“”无法识别,python代码多为后者要修改!
我的环境只有debug目录,如果你有realease目录,使用realease目录。
运行.bat成功后,会开始训练,训练结束界面如下:
最后几行可以看到accuracy的准确率可以达到99%,也是相当准确了!
提示,caffe文件夹内会生成.caffemodel文件
使用caffemodel文件开始测试:
三.测试数据
由于测试数据集也是直接下载好了的leveldb文件,所以省了不少步骤
直接新建mnist_test.bat文件,类似训练mnist模型一样,对该模型进行数据测试。
cd ../../<span>"</span><span>build/x64/debug/caffe.exe</span><span>"</span> test --model=examples/mnist/lenet_train_test.prototxt -weights=examples/mnist/<span>lenet_iter_10000.caffemodel pause </span>
类似mnits_train.bat,修改文件路径名,test表示用于测试,model指向自己的网络模型文件,最后添加权值文件.caffemodel进行测试。
运行mnist_test.bat后,成功界面如下:
最后一行还是有98%的准确率还是很不错的,说明模型生成的还不错。
总结:其实还遇到了不少零零碎碎的问题,大多都可以百度解决,主要是记得修改对自己的文件路径目录,windows下一定要使用leveldb数据文件,.prototxt也记得修改,然后就是等待模型跑完看结果了,看到高准确率还是很开心的~
四. 使用该模型
模型训练好了,数据也只是测试了,那么我们要使用该模型判断一张图片是数字几该如何做呢?
这个时候需要生成 classification.exe,然后执行相应的.bat命令来预测图片的分类结果。
mnist分类使用可以参考http://www.cnblogs.com/yixuan-xu/p/5862657.html
发现opencv可以加载caffe 框架模型,准备再写一篇博客进行实践介绍~
http://docs.opencv.org/3.1.0/d5/de7/tutorial_dnn_googlenet.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!