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。