caffe学习资料


一、Caffe概述

Caffe是纯粹的C++/CUDA架构,支持命令行、Python和MATLAB接口;可以在CPU和GPU直接无缝切换。

对于神经网络的计算能力可以理解为通过一层层Layer的计算归纳,逐步的将抽象的原始数据变的具体。以图片识别为例,输入是一个个像素点,经过每层神经网络,逐步变化成为线、面、对象的概念,然后机器有能力能够识别出来。

二、Caffe组成

Caffe主要由Blob、Layer、Net、Solver四部分组成。Caffe架构如图所示。

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学习资料

 

Caffe训练调用过程如下图所示。

caffe学习资料

完成一个网络模型训练预测,其准备过程与调用过程相反,主要包含几个步骤:

1.    数据格式处理

把训练图片及标注文件打包为caffe所需要的lmdb(leveldb)格式文件。只需运行caffe/example/imagenet文件夹下面的一些脚本文件即可生成。

caffe学习资料

需要准备四个文件夹:

Ø  文件夹train,用于存放训练图片

Ø  文件夹val,用于存放验证图片

Ø  文件train.txt,里面包含这每张图片的名称,及其对应的标签。

Ø  文件val.txt,同样这个文件也是保存图片名称及其对应的标签

  使用脚本文件生成lmdb文件如图所示。

caffe学习资料

文件夹下面有两个对应的文件:

 caffe学习资料

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