Caffe的运行,首先要基于一个模型(model),比较常用的模型有Lenet、AlexNet、VGG等;一个模型有多个层构成,层有许多种类型,比如数据层(Data Layers)、视觉层(Vision Layers)、激活层(Activation Layers)等,每层对应着许多参数,这些参数都定义在caffe.proto这个配置文件中。
数据层及其参数的介绍在前一篇文章caffe中的数据层及对应参数进行讨论。
接下来,我们来讨论一下视觉层(Vision Layers)及其参数。
视觉层包括Convolution、Pooling、Local Response Normalization(LRN)等。下面进行详细介绍。
卷积层是卷积神经网络(CNN)的核心层。下面以示例作为说明:
layer { name:"conv1"//层名称 type:"Convolution"//层类型 bottom:"data"//输入数据 top:"conv1"//输出数据 param {//参数 lr_mult:1//学习率系数,最终的学习率 = 该数 * solver.prototxt配置文件中的base_lr } param { lr_mult:2 } convolution_param {//在这里面设定卷积层的特有参数 num_output:20//卷积核(filter)的个数 kernel_size:5//卷积核的大小。如果卷积核的长和宽不相等,则需用kernel_h和kernel_w分别进行设定 stride:1//卷积核的步长,一般默认为1. weight_filler {//权值初始化 type:"xavier" } bias_filler {//偏置顶初始化 type:"constant" } } } 注:1)如果有两个lr_mult,则第一个表示权值学习率,第二个表示偏置顶的学习率;一般来说,偏置顶的学习率是权值学习率的两倍。2)num_output和kernel_size这两个参数是必须设置的。
输入:n * c0 * w0 * h0
输出:n * c1 * w1 * h1
其中,c 1 就是参数中的num_output,生成的特征图个数
w 1 =(w 0 +2*padkernel_size)/stride+1;
h 1 =(h 0 +2*padkernel_size)/stride+1;
如果设置stride为1,前后两次卷积部分存在重叠。如果设置pad=(kernel_size1)/2,则运算后,宽度和高度不变。
Pooling是为了减少运算量和数据维度而设置的一种层。下面以示例作为说明:
layer { name: "pool1" type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { pool:MAX//池化方法,默认为MAX,目前可用的方法有MAX、AVE或STOCHASTIC kernel_size:3//池化的核大小,也可以用kernel_h和kernel_w来设定 stride:2//池化的步长,默认为1;一般我们设置为2,即不重叠 } } Pooling层的运算方法基本和卷积层的一样。输入:n * c * w0 * h0
输出:n * c * w1 * h1
和卷积层的区别就是其中的c保持不变,
w 1 =(w 0 +2*pad-kernel_size)/stride+1;
h 1 =(h 0 +2*pad-kernel_size)/stride+1;
如果设置stride为2,前后两次卷积部分不重叠。100*100的特征池化后,变成50*50。
LRN层是对输入的局部区域进行归一化,达到“侧抑制”的效果。
layers{ name: "norm1" type: LRN bottom: "pool1" top: "norm1" lrn_param { local_size:5//默认为5;如果是跨通道LRN,则表示求和的通道数,如果是在通道内LRN,则表示求和的正方形区域长度。 alpha:0.0001//归一化公式中的参数 beta:0.75//归一化公式中的参数 } }补充:归一化公式:对于每一个输入,去除以,得到归一化后的输出。