本文主要讲解caffe的整个使用流程,适用于初级入门caffe,通过学习本篇博文,理清项目训练、测试流程。初级教程,高手请绕道。
我们知道,在caffe编译完后,在caffe目录下会生成一个build目录,在build\x64\release\目录下有个caffe.exe
有了这个可执行文件我们就可以进行模型的训练,只需要学会调用这个可执行文件就可以了,这便是最简单的caffe学习,不需要对caffe底层的东西懂太多,只需要会调参数,就可以构建自己的网络,然后调用这个可执行文件就可以进行训练,当然如果你不仅仅是调参数,而且想要更改相关的算法,那就要深入学习caffe的底层函数调用了,这个以后再讲。本篇博文仅适合于刚入门学习caffe,高手请绕道。废话不多说,
回归正题:
一、总流程
完成一个简单的自己的网络模型训练预测,主要包含几个步骤:
1、数据格式处理,也就是把我们的图片.jpg,.png等图片以及标注标签,打包在一起,搞成caffe可以直接方便调用的文件。后面我将具体讲解如何打包自己的数据,让caffe进行调用。
2、编写网络结构文件,这个文件的后缀格式是.prototxt。就是编写你的网络有多少层,每一层有多少个特征图,输入、输出……。看个例子,看一下caffe-》example-》mnist-》lenet_train_test.prototxt。这个便是手写字体网络结构文件了,我们需要根据自己的需要学会修改这个文件:
<span style="font-size:18px;">name: "LeNet"
layer {
name: "mnist"
type: "Data" //data层
top: "data"
top: "label"
include {
phase: TRAIN //训练阶段
}
transform_param {
scale: 0.00390625 //对所有的图片归一化到0~1之间,也就是对输入数据全部乘以scale,0.0039= 1/255
}
data_param {
source: "examples/mnist/mnist_train_lmdb" //训练数据图片路径
batch_size: 64 //每次训练采用的图片64张,min-batch
backend: LMDB
}
}
layer {
name: "mnist"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST //测试
}
transform_param {
scale: 0.00390625
}
data_param {
source: "examples/mnist/mnist_test_lmdb" //测试数据图片路径
batch_size: 100
backend: LMDB
}
}
layer {
name: "conv1" //卷积神经网络的第一层,卷积层
type: "Convolution" //这层操作为卷积
bottom: "data" //这一层的前一层是data层
top: "conv1" //
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 20 //定义输出特征图个数
kernel_size: 5 //定义卷积核大小
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "pool1"
type: "Pooling" //池化层,这一层的操作为池化
bottom: "conv1" //这一层的前面一层名字为:conv1
top: "pool1"
pooling_param {
pool: MAX //最大池化
kernel_size: 2
stride: 2
}
}
layer {
name: "conv2"
type: "Convolution"
bottom: "pool1"
top: "conv2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 50
kernel_size: 5
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "ip1"
type: "InnerProduct"
bottom: "pool2"
top: "ip1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 500
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "ip1"
top: "ip1"
}
layer {
name: "ip2"
type: "InnerProduct"
bottom: "ip1"
top: "ip2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 10
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "ip2"
bottom: "label"
top: "accuracy"
include {
phase: TEST
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "ip2"
bottom: "label"
top: "loss"
}</span>
上面的网络结构,定义的data层,就是定义我们输入的训练数据的路径、图片变换等。
3、网络求解文件,这个文件我们喜欢把它取名为:solver.prototxt,这个文件的后缀格式也是.prototxt。这个文件主要包含了一些求解网络,梯度下降参数、迭代次数等参数……,看下手写字体的solver.prototxt文件:
<span style="font-size:18px;">net: "examples/mnist/lenet_train_test.prototxt" //定义网络结构文件,也就是我们上一步编写的文件test_iter: 100
test_interval: 500 //每隔500次用测试数据,做一次验证
base_lr: 0.01 //学习率
momentum: 0.9 //动量参数
weight_decay: 0.0005 //权重衰减系数
lr_policy: "inv" //梯度下降的相关优化策略
gamma: 0.0001
power: 0.75
display: 100
max_iter: 10000 //最大迭代次数
snapshot: 5000 //每迭代5000次,保存一次结果
snapshot_prefix: "examples/mnist/lenet" //保存结果路径
solver_mode: GPU //训练硬件设备选择GPU还是CPU</span>
这个文件的输入就是我们前面一步定义的网络结构。
4、编写网络求解文件后,我们可以说已经完成了CNN网络的编写。接着我们需要把这个文件,作为caffe的输入参数,调用caffe可执行文件,进行训练就可以了。具体的命令如下:
./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt
然后solver就是我们在步骤3编写的solver文件了,只要在ubuntu终端输入上面的命令,就可以开始训练了。
回想一下文件调用过程:首先caffe可执行文件,调用了solver.prototxt文件,而这个文件又调用了网络结构文件lenet_train_test.prototxt,然后lenet_train_test.prototxt文件里面又会调用输入的训练图片数据等。因此我们如果要训练自己的模型,需要备好3个文件:数据文件lmdb(该文件包含寻数据)、网络结构lenet_train_test.prototxt、求解文件solver.prototxt,这几个文件名随便,但是文件后缀格式不要随便乱改。把这三个文件放在同一个目录下,然后在终端输入命令,调用caffe就可以开始训练了。
原文地址:http://blog.csdn.net/hjimce/article/details/48933813
细分流程:
1.下载数据集
2.下载的原始数据转换为LMVB或是LEVELDB
3.修改网络描述文件train.prototxt
4.修改超参数文件solver.prototxt
5.训练模型
6.准备测试图片
7.生成均值文件
8.准备标签
9.测试分类效果