caffe常见层及其prototxt设置

 

输入:

 

Convolution:

layer {
    name: ""
    type: "Convolution"
    bottom: ""
    top: ""
    param { lr_mult: 1 }  
    param { lr_mult: 2 }  
        # 学习率的系数,最终的学习率是这个数乘以solver.prototxt配置文件中的base_lr
        # 如果有两个lr_mult, 则第一个表示权值的学习率,第二个表示偏置项的学习率。
        # 一般偏置项的学习率是权值学习率的两倍。
    convolution_param {
        num_output: 20    #卷积核个数    
        kernel_size: 5    #卷积核的大小(或 kernel_h、kernel_w ) 
        stride: 1    #步长,默认为1(或 stride_h、stride_w )  
        pad: 0       #默认为0,不扩充,扩充的时候是左右、上下对称的。(或 pad_h、pad_w )
        weight_filler {   # 权重初始化,默认为constant,值全为0。
            type: "constant/xavier/gaussian"
        }
        bias_filler {     # 偏置项的初始化
            type: "constant"
        }
        bias_term: true   #是否开启偏置项,默认为true, 开启
        group: 1          #分组,默认为1组。如果大于1,我们限制卷积的连接操作在一个子集内。如果我们根据图像的通道来分组,那么第i个输出分组只能与第i个输入分组进行连接。
            # caffe Convolution层的convolution_param参数字典中有一个group参数,其意思是将对应的输入通道与输出通道数进行分组,比如输入数据大小为90x100x100x32 90是数据批大小 100x100是图像数据shape,32是通道数,要经过一个3x3x48的卷积,group默认是1,就是全连接的卷积层,如果group是2,那么对应要将输入的32个通道分成2个16的通道,将输出的48个通道分成2个24的通道。对输出的2个24的通道,第一个24通道与输入的第一个16通道进行全卷积,第二个24通道与输入的第二个16通道进行全卷积。极端情况下,输入输出通道数相同,比如为24,group大小也为24,那么每个输出卷积核,只与输入的对应的通道进行卷积。
    }
}

 

InnerProduct:

全连接层,把输入当作成一个向量,输出也是一个简单向量。

输入: n*c0*h*w

输出: n*c1*1*1   (c1是卷积核的数量,输入数据blobs的width和height全变为1)

是卷积核大小和原数据大小一样的卷积层,它的参数基本和卷积层的参数一样。

layer {
    name: " "
    type: "InnerProduct"
    bottom: " "
    ......
}

 

Pooling:

为了减少运算量和数据维度而设置的一种层。

layer {
    name: 
    type: "Pooling"
    bottom:
    top:
    pooling_param {
        pool: MAX/AVE/STOCHASTIC    # 池化方法,默认为MAX
        kernel_size: 3              # 池化核,或 kernel_h、kernel_w
        stride: 2                   # 步长,默认为1 或 stride_h、stride_w
        pad: 0                      # 默认为0
    }
}

 

ReLU:

非线性激活的一种,常常在卷积、归一化层后面(当然这也不是一定的)。

其支持相同名字的bottom和top,这些名字相同的blob就是同一个blob,占用的是同一个空间,即支持 in-place计算。

caffe中的in-place操作:caffe利用in-place计算可以节省内(显)存,同时还可以省去反复申请和释放内存的时间。

目前已知的支持in-place操作的层有:ReLU层,Dropout层,BatchNorm层,Scale层。

layer {
    name: ""
    type: "ReLU"
    bottom: "conv/bn"
    top: "conv/bn"
    relu_param {
        negative_slope: 0   # 默认为0,x>0时,输出x;x<=0时,输出0。max(x,0)
            # 如果设置了参数,当x>0时,输出x;当x<=0时,输出 x*negative_slope
    }
}

 

BatchNorm:

功能:对minibatch的数据作归一化(Normalized)

x_{norm} = (x-u)/std, x_norm = (x-u)/std ,其中u和std是个累计计算的均值和方差,此外还有滑动系数。

借鉴来的:BN主要原理是使得每一层的输出的分布相同,从而让网络的每一层不必再因为需要学习数据分布上的不同而受到影响。BN的好处包括允许网络使用较高的学习率,能够起到一定的regularization的作用等等,从而加速训练。一般来讲BN layer可以放在FC layer或conv layer的后边,数据量大或复杂的情况下可以每层都放。也有说法认为在小数据量或网络简单的情况下,在data layer后边放一个就好了。

layer {
    name: "fc1/bn"
    type: "BatchNorm"
    bottom: "fc1"   #FC/conv
    top: "fc1/bn"
    batch_norm_param{
        use_global_stats: true/false
            # true: 使用保存的均值和方差;false: 用滑动平均计算新的均值和方差
            # 默认训练过程中为 false,测试过程为 true
        moving_average_fraction:
            # 滑动平均的衰减系数,默认为0.999
        eps:分母附加值,防止除以方差时出现除0操作,默认为1e-5
    }
    #参数 分别存储:均值、方差、滑动系数
    param { lr_mult: 0   decay_mult: 0 }
    param { lr_mult: 0   decay_mult: 0 }
    param { lr_mult: 0   decay_mult: 0 }
}

 

Scale:

对 batchnorm 归一化后的x进行比例缩放和位移。

y = \alpha *x_{norm}+\beta  ,其中alpha和beta是通过迭代学习的。 (alpha和beta均为chenel维的向量,不同channel使用各自的alpha和beta,同一个channel的alpha和beta都一样。)

layer {
    name: "fc1/scale"
    type: "Scale"
    bottom: "fc1/bn"
    top: "fc1/scale"
    scale_param {
        bias_term: true
    }
    param { name: " "  lr_mult: 0 }
    param { name: " "  lr_mult: 0 }
}

 

Concat:

在nums或者channels维度上进行特征拼接 (Ni*Ci*H*W)

  • 选择axis=0,表示在num维度上进行拼接,拼接后的blob为:(N1+N2)*C*H*W;
  • 选择axis=1,表示在channel维度上进行拼接,拼接后的blob为:N*(C1+C2)*H*W。

concat层多用于利用不同尺度特征图的语义信息,将其以增加channel的方式实现较好的性能,但往往应该在BN(batchnorm和scale层)之后再concat才会发挥它的作用,而在num维度的拼接较多使用在多任务问题上。

layer {
    name: " "
    type: "Concat"
    bottom: "in1"
    bottom: "in2"
    top: "out"
    concat_param:{
        axis: 0/1
    }
}

 

Slice:

concat的逆过程,和concat一起常用在多任务学习中。

“可以使用slice层进行多标签学习的时候,运用concat层增加相邻层的语义相关性,增强模型对特征的表达能力”

layer {
    name: " "
    type: "Slice"
    bottom: "b"
    top: "t1"
    top: "t2"
    top: "t3"
    slice_param {
        axis: 1   #指定沿着哪个维度拆分,默认为1,拆分chenels;为0,拆分nums
        #slice_dim: 1    #用于指定切分维度,默认为1,拆分chenels,和axis只能二选一
        slice_point: 1   #指定拆分点,其中slice_point的个数必须等于top的个数减一。  
        slice_point:  2   #若输入3000*3*224*224,输出三个3000*1*224*224
    }
}

 

Split:

Creates a "split" path in the network by copying the bottom Blob into multiple top Blobs to be used by multiple consuming layers. 大意是把一个bottom的blob复制成几个相同的blob给top层用。

 

softmax:

常用在分类过程中,尤其是多分类

把输入映射至0-1之间的实数,且这些实数的归一化和为1

每个实数代表实例属于每个类别的概率

公式:

x_i = x_i - max(x_1,x_2,x_3, ..., x_n)    防止数据溢出

p_i = e^{x_i} / sum(e^{x_1}+e^{x_2}+...+e^{x_n})    计算不同类别的相对概率(数据x属于类别i的概率)

layers {
	name:
	type: "softmax"
	bottom: fc
	top:  prob
}

 

softmax loss:

layer {
  name: " "
  type: "SoftmaxWithLoss"
  bottom: "fc"
  bottom: "label"
  top: "loss"
  top: "prob"  #归一化后的结果
  loss_param{
    ignore_label:0  # int型变量,默认为空   
        # 如果指定值,则label等于ignore_label的样本将不参与Loss计算,并且反向传播时梯度直接置0.
    normalize: 1   # bool型变量
        # 如果值为1: Loss会除以参与计算的样本总数(VALID);否则Loss等于直接求和(BATCH_SIZE)
        # 一旦设置normalization,归一化方式则由normalization决定,不再考虑normalize。
    normalization: FULL  #enum型变量,默认为VALID
        #
  }
}

 

ContrastiveLoss:

对比损失。针对同时处理成对数据(识别两张图片是否为同一张人脸、文本/图像对等)的网络。

公式:

L=\frac{1}{2n}\sum_{n=1}^{N}yd^2+(1-y)*max(margin-d,0)^2,               其中  d=||a_n-b_n||^2

当 y=1 时(两个样本相似或匹配),L=\frac{1}{2n}\sum_{n=1}^{N}yd^2;            # d越大越不相似,损失越大

当 y=0 时(两个样本不匹配),L=(1-y)*max(margin-d,0)^2。             # d越大越不相似,损失越小

layer {
  name: "contrastive_loss" 
  type: "ContrastiveLoss" 
  bottom: "img_fc/bn" 
  bottom: "txt_fc/bn"
  bottom: "similarity"
  top: "contrastive_loss"
  loss_weight: 0.001
  contrastive_loss_param { margin: 1 }
}

 

Accuracy:

输出分类(预测)精度,只在test阶段。

layer {
  name: " "
  type: "Accuracy"
  bottom: "fc/..."
  bottom: "label"
  top: "accuracy"
  include: { phase: TRAIN }     #只在test阶段有,所以必须加include
}

 

 

 

 

参考:

Caffe中Convolution层

Caffe Batchnorm层使用小结

caffe层解读系列——BatchNorm

torch和caffe中的BatchNorm层

caffe中关于(ReLU层,Dropout层,BatchNorm层,Scale层)输入输出层一致的问题

slice层解析

三分钟带你对 Softmax 划重点

你可能感兴趣的:(caffe)