Caffe Layers

Caffe Layers 学习

1、Inner Product layer
功能:全连接层,把输入当作成一个向量,输出也是一个简单向量(把输入数据blobs的 width和 height全变为1。

输入: n*c0*h*w
输出: n*c1*1*1

全连接层实际上也是一种卷积层,只是它的卷积核大小和原数据大小一致。因此它的参数基本和卷积层的参数一样。

层类型:InnerProduct

lr_mult: 学习率的系数,最终的学习率是这个数乘以solver.prototxt配置文件中的base_lr。
如果有两个lr_mult, 则第一个表示权值的学习率,第二个表示偏置项的学习率。一般偏置项的学习率是权值学习率的两倍。

必须设置的参数:

  num_output: 过滤器( filfter)的个数

其它参数:
  weight_filler: 权值初始化。 默认为“constant”,值全为0,很多时候我们用”xavier”算法来进行初始化,也可以设置为”gaussian”
  bias_filler: 偏置项的初始化。一般设置为”constant”,值全为0。
   bias_term: 是否开启偏置项,默认为true, 开启
  

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" 
    } 
  } 
}

2、reshape layer
功能:在不改变数据的情况下,改变输入的维度。

层类型:Reshape

先来看例子,

 layer { 
    name: "reshape" 
    type: "Reshape" 
    bottom: "input" 
    top: "output" 
    reshape_param { 
      shape { 
        dim: 0  # copy the dimension from below 
        dim: 2 
        dim: 3 
        dim: -1 # infer it from the other dimensions 
      } 
    } 
  } 

有一个可选的参数组shape, 用于指定blob数据的各维的值(blob是一个四维的数据:n*c*w*h)。

dim:0 表示维度不变,即输入和输出是相同的维度。

dim:2 或 dim:3 将原来的维度变成2或3

dim:-1 表示由系统自动计算维度。数据的总量不变,系统会根据blob数据的其它三维来自动计算当前维的维度值 。

假设原数据为:64*3*28*28, 表示64张 3通道的28*28的彩色图片

经过reshape变换:

   reshape_param { 
      shape { 
        dim: 0 
        dim: 0 
        dim: 14 
        dim: -1 
      } 
    } 

输出数据为:64*3*14*56。

3、softmax-loss layer
softmax-loss层和softmax层计算大致是相同的。
softmax是一个分类器,计算的是类别的概率(Likelihood),是Logistic Regression 的一种推广。
Logistic Regression 只能用于二分类,而softmax可以用于多分类。

关于两者的区别更加具体的介绍,可参考: http://freemind.pluskid.org/machine-learning/softmax-vs-softmax-loss-numerical-stability/

用户可能最终目的就是得到各个类别的概率似然值,这个时候就只需要一个 Softmax层,而不一定要进行softmax-Loss 操作;或者是用户有通过其他什么方式已经得到了某种概率似然值,然后要做最大似然估计,此时则只需要后面的 softmax-Loss 而不需要前面的 Softmax 操作。因此提供两个不同的 Layer 结构比只提供一个合在一起的 Softmax-Loss Layer 要灵活许多。

不管是softmax layer还是softmax-loss layer,都是没有参数的,只是层类型不同而已。

softmax-loss layer:输出loss值

layer { 
  name: "loss" 
  type: "SoftmaxWithLoss" 
  bottom: "ip1" 
  bottom: "label" 
  top: "loss" 
} 

softmax layer: 输出似然值

layers { 
  bottom: "cls3_fc" 
  top: "prob" 
  name: "prob" 
  type: “Softmax" 
} 

4、Concat layer
功能:concat层实现输入数据的拼接。
该层有两个相同作用的参数:

message ConcatParameter { 
  //指定拼接的维度,默认为1即以channel通道进行拼接;支持负索引,即-1表示最后一个维度 
  optional int32 axis = 2 [default = 1]; 

  // 以后会被弃用,作用同axis一样,但不能指定为负数 
  optional uint32 concat_dim = 1 [default = 1]; 
} 

caffe中数据通常为4个维度,即 num×channels×height×width,因此默认值-1表示channels通道进行拼接。

使用方法如下

layer { 
  name: "data_all" 
  type: "Concat" 
  bottom: "data_classfier" 
  bottom: "data_boundingbox" 
  bottom: "data_facialpoints" 
  top: "data_all" 
  concat_param { 
    axis: 0 
  } 
} 

除了拼接维度外的其它维度都必须相等。

比如上面,输入图像均为 24×24×3, 用于分类的有150张图片, 用于boundingbox回归的有50张, 用于关键点回归的也有50张, 则最后拼接的结果就是 (150+50+50)×3×24×24。

5、Slice layer

既然有合并,那么相应的也有拆分。slice层共有三个参数:

message SliceParameter {
  // 下面两个指定沿哪个维度进行拆分,默认拆分channels通道
  optional int32 axis = 3 [default = 1];
  optional uint32 slice_dim = 1 [default = 1];

  // 指定拆分点
  repeated uint32 slice_point = 2;
}

现在我们就要把之前concat合并的数据按照原样拆分:

layer {
  name: "data_each"
  type: "Slice"
  bottom: "data_all"
  top: "data_classfier"
  top: "data_boundingbox"
  top: "data_facialpoints"
  slice_param {
    axis: 0
    slice_point: 150
    slice_point: 200
  }
}

其中slice_point的个数必须等于top的个数减一。输入的data_all维度为 250×3×24×24,拆分后的3个输出的维度依次为 150×3×24×24, 50×3×24×24, 50×3×24×24。

6、Flatten layer

Flattening:类型为:Flatten
偏平的意思,如 flattens an input of shape n * c * h * w to a simple vector output of shape n * (c*h*w))。

本人才疏学浅,如有错误,请及时指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值