Caffe入门:slice层

Slice Layer接收top blob的数据,并再指定维度做分割处理。可根据给定的维度将bottom切分成多个top,用于具有多个输入多任务的网络。slice层有三个参数,axis和slice_dim用于指定切分的维度是什么,默认为1,切分channel维度(一般是四个维度:【N,C,H,W】);还有另一个选择就是切分num,类似于Concat层,但是注意这两个参数只能指定一个,常用axis。第三个参数就是指定从哪里开始切分,怎么切分?这个参数就是slice_point,因此slice层的运用格式为:

layer {
  name: "slicelayer"
  type: "Slice"
  bottom: "labels"
  top: "labels1"
  top: "labels2"
  top: "labels3"
  slice_param {
    axis: 1
    slice_point: 1
    slice_point: 2
  }
}

解释一下,我们的labels是由3个数字组成的,所以3个任务当然要切分成3个label,怎么切呢,显然我们labels之间每隔1为一个label,切2次就搞定了,所以注意slice_point的个数要比top的个数少一个,大概的意思就是一根绳子剪几次有3段?答案是2次,当然绳子是无折叠的,很单纯的。

caffe.proto中定义如下:

message SliceParameter {
  // The axis along which to slice -- may be negative to index from the end
  // (e.g., -1 for the last axis).
  // By default, SliceLayer concatenates blobs along the "channels" axis (1).
  #在指定维度上做分割
  optional int32 axis = 3 [default = 1];
  #指定分割点,不指定则均匀分割
  repeated uint32 slice_point = 2;
 
  //等同于axis
  // DEPRECATED: alias for "axis" -- does not support negative indexing.
  optional uint32 slice_dim = 1 [default = 1];
}

prototxt文件定义示例1:

layer{
  name: "slice1"
  type:"Slice"
  slice_param {
	slice_dim: 1    #在维度一上做均匀分割(Channel维度)
  }
  bottom: "conv1"
  top: "slice1_1"    #分割后的第一部分赋值个blob slice1_1
  top: "slice1_2"    #分割后的第二部分赋值个blob slice2_2
}

prototxt文件定义示例2:

layer {
  name:"data_each"
  type:"Slice"
  bottom:"data_all"
  top:"data_classfier"    #输出blob1
  top:"data_boundingbox"  #输出blob2
  top:"data_facialpoints" #输出blob3
  slice_param {
    axis:0					#在维度0上做均匀分割(blocks维度)
    slice_point:100        #指定blob1和blob2的分割点
    slice_point: 150       #指定blob2和blob3的分割点
  }
}

其中slice_point的个数等于top的个数减1。
加入的data_all为 250×3×24×24的blob,拆分后的3个输出的维度依次为 100×3×24×24,50×3×24×24,100×3×24×24。

发布了185 篇原创文章 · 获赞 873 · 访问量 127万+

猜你喜欢

转载自blog.csdn.net/duan19920101/article/details/103221499