caffe的网络层结构

Posted xiaochouk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了caffe的网络层结构相关的知识,希望对你有一定的参考价值。

1、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通道进行拼接。

  • 选择axis=0,表示在num维度上进行拼接,可表示为:(k1+k2)*C*H*W;
  • 选择axis=1,表示在channel维度上进行拼接,可表示为:N*(k1+k2)*H*W。(对应于上面给出的4个维度)
layer {
  name: "data_all"
  type: "Concat"
  bottom: "data_classfier"
  bottom: "data_boundingbox"
  bottom: "data_facialpoints"
  top: "data_all"
  concat_param {
    axis: 0
  }
}

除了拼接维度外的其它维度都必须相等。比如上面,输入图像均为 24×24×324×24×3,用于分类的有150张图片,用于boundingbox回归的有50张,用于关键点回归的也有50张,则最后拼接的结果就是 (150+50+50)×3×24×24
2、Slice层

与concat对应的是Slice层,来实现对数据集的拆分:

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

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

此处将如上合并的数据集进行拆分:

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



 






以上是关于caffe的网络层结构的主要内容,如果未能解决你的问题,请参考以下文章

Caffe代码解析Layer网络层

caffe之卷积层

caffe之loss层

caffe之pooling层

caffe添加自己编写的Python层

如何使用 caffe batch norm