caffe学习资料
一、Caffe概述
Caffe是纯粹的C++/CUDA架构,支持命令行、Python和MATLAB接口;可以在CPU和GPU直接无缝切换。
对于神经网络的计算能力可以理解为通过一层层Layer的计算归纳,逐步的将抽象的原始数据变的具体。以图片识别为例,输入是一个个像素点,经过每层神经网络,逐步变化成为线、面、对象的概念,然后机器有能力能够识别出来。
二、Caffe组成
Caffe主要由Blob、Layer、Net、Solver四部分组成。Caffe架构如图所示。
其中
Convolution层:卷积层,是卷积神经网络(CNN)的核心层。
Pooling层:池化层,为了减少运算量和数据维度而设置的一种层。
(LRN)层:是对一个输入的局部区域进行归一化,达到“侧抑制”的效果。
Relu:**函数层
Dropout:防止过拟合
Softmax:输出层
1. Blob
Blob 主要用来表示网络中的数据,包括
l 训练数据
l 网络各层自身的参数(包括权值、偏置以及它们的梯度)
l 网络之间传递的数据都是通过Blob 来实现的
l Blob数据支持在CPU 与GPU 上存储,能够在两者之间做同步。
l 数学上,Blob是用以存储数据的4维数组,例如:对于数据:Number*Channel*Height*Width(图像数量*通道数量*图像高度*图像宽度),
对于卷积权重:Output*Input*Height*Width,对于卷积偏置:Output*1*1*1
2. Layer
Layer 是对神经网络中各种层的一个抽象,包括我们熟知的卷积层和下采样层,还有全连接层和各种**函数层等等。
同时每种Layer 都实现了前向传播和反向传播,并通过Blob 来传递数据。
Caffe层的定义由2部分组成:层属性与层参数,例如
name:"conv1" //层名称
type:CONVOLUTION //层类型
bottom:"data" //层连接结构(输入blob和输出blob)
top:"conv1"
convolution_param{ //各种层参数
num_output:<span>20
kernel_size:5
stride:1
weight_filler{
type:"<span style="color: #c0504d;">xavier</span>"
}
}
3. Net
Net 是对整个网络的表示,由各种Layer 前后连接组合而成,也是我们所构建的网络模型。训练部分详细阐述。
4. Solver
l Solver定义了针对Net 网络模型的求解方法。
l 记录网络的训练过程
l 保存网络模型参数
l 中断并恢复网络的训练过程
l 自定义Solver 能够实现不同的网络求解方式。有多种优化方法,用来使loss值最小化的基于梯度的优化方法。调用forward算法计算最终的输出值及loss,调用backward计算梯度。
三、Caffe训练过程
在caffe编译完后,在caffe目录下会生成一个build目录,在build目录下有个tools,这个里面有个可执行文件caffe,如下图所示。只需要会调参数,就可以构建自己的网络,然后调用这个可执行文件就可以进行训练。
Caffe训练调用过程如下图所示。
完成一个网络模型训练预测,其准备过程与调用过程相反,主要包含几个步骤:
1. 数据格式处理
把训练图片及标注文件打包为caffe所需要的lmdb(leveldb)格式文件。只需运行caffe/example/imagenet文件夹下面的一些脚本文件即可生成。
需要准备四个文件夹:
Ø 文件夹train,用于存放训练图片
Ø 文件夹val,用于存放验证图片
Ø 文件train.txt,里面包含这每张图片的名称,及其对应的标签。
Ø 文件val.txt,同样这个文件也是保存图片名称及其对应的标签
使用脚本文件生成lmdb文件如图所示。
文件夹下面有两个对应的文件:
2. 编写网络结构文件(NET)
这个文件的后缀格式是.prototxt。主要包括编写的网络有多少层,每一层有多少个特征图,输入、输出等。下面列举了ssd的部分网络结构ssd/caffe/jobs/VGGNet/VOC0712/SSD_500x300/train.prototxt。
name:"VGG_VOC0712_SSD_500x300_test"
layer {
name: "data" //data层,定义输入训练数据的路径、图片变换等。
type: "AnnotatedData"
top: "data"
top: "label"
include {
phase: TEST //训练阶段
}
transform_param {
mean_value: 104
mean_value: 117
mean_value: 123
resize_param {
prob: 1
resize_mode: WARP
height: 300
width: 500
interp_mode: LINEAR
}
}
data_param {
source:"examples/VOC0712/VOC0712_test_lmdb" //训练数据图片路径
batch_size: 2 //每次训练采用的图片2张,min-batch
backend: LMDB
}
annotated_data_param {
batch_sampler {
}
label_map_file:"data/VOC0712/labelmap_voc.prototxt"
}
}
layer {
name: "conv1_1" //卷积神经网络的第一层,卷积层
type: "Convolution" //这层操作为卷积
bottom: "data" //这一层的前一层是data层
top: "conv1_1"
param {
lr_mult: 1 //学习率
decay_mult: 1 //权值衰减,为了避免模型的over-fitting
}
param {
lr_mult: 2
decay_mult: 0
}
convolution_param {
num_output: 64
pad: 1 //扩充边缘
kernel_size: 3 //定义卷积核大小
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "relu1_1" //**函数层
type: "ReLU"
bottom: "conv1_1"
top: "conv1_1"
}
···································
layer {
name: "detection_out" //输出层
type: "DetectionOutput"
bottom: "mbox_loc"
bottom: "mbox_conf_flatten"
bottom: "mbox_priorbox"
top: "detection_out"
include {
phase: TEST
}
detection_output_param {
num_classes: 2
share_location: true
background_label_id: 0
nms_param {
nms_threshold: 0.45
top_k: 400
}
save_output_param {
output_directory:"/home/chh/ssd/caffe/data/VOCdevkit/results/VOC2007/SSD_500x300/Main"
output_name_prefix:"comp4_det_test_"
output_format: "VOC"
label_map_file:"data/VOC0712/labelmap_voc.prototxt"
name_size_file: "data/VOC0712/test_name_size.txt"
num_test_image: 114
}
code_type: CENTER_SIZE
keep_top_k: 200
confidence_threshold: 0.01
}
}
layer {
name: "detection_eval" //检测评估层
type: "DetectionEvaluate"
bottom: "detection_out"
bottom: "label"
top: "detection_eval"
include {
phase: TEST
}
detection_evaluate_param {
num_classes: 2
background_label_id: 0
overlap_threshold: 0.7
evaluate_difficult_gt: false
name_size_file: "data/VOC0712/test_name_size.txt"
}
}
3. Solver网络求解文件
这个文件一般取名为solver.prototxt。这个文件主要包含了一些求解网络,梯度下降参数、迭代次数等参数……,这个文件的输入就是我们前面一步定义的网络结构。ssd的solver.prototxt文件部分如下:
<span style="font-size:18px;">net: "ssd/caffe/jobs/VGGNet/VOC0712/SSD_500x300/train.prototxt" //定义网络结构文件,也就是上一步编写的文件
test_iter: 100 //每次test迭代次数=总样本/batch_size
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/···" //保存结果路径
solver_mode: GPU //训练硬件设备选择GPU还是CPU</span>
4. 编写网络求解文件后训练
完成了CNN网络的编写。接着我们需要把solver文件,作为caffe的输入参数,调用caffe可执行文件,进行训练即可。
训练方法有以下几种:
1) 直接训练法
利用脚本文件或命令行直接进行训练。具体的命令如下:
./build/tools/caffe train --solver=examples/jobs/solver.prototxt
其中: caffe,就是编译caffe生成的可执行文件。
solver就是步骤3编写的solver文件
2) 采用fine-tuning训练法
加入-weights,利用已有的模型训练好的参数,作为初始值,进行继续训练,具体的命令如下:
./build/tools/caffe train --solver=examples/jobs/solver.prototxt-weights net.caffemodel
3) 调用python接口
caffe提供了方便调用的python接口函数,ssd就是通过调用接口进行训练的,它同时包含了pycaffe加载训练好的模型,进行预测及其特征可视化的调用方法。
4) 继续中断的文件
./build/tools/caffetrain --solver=./jobs/VGGNet/VOC0712/SSD_500x300/solver.prototxt \
--snapshot=./mods/VGGNet/VOC0712/SSD_500x300/VGG_VOC0712_SSD_500x300_iter_21786.solverstate2>&1 | tee ./jobs/VGGNet/VOC0712/SSD_500x300/lst.log