原
caffe中的Slice层
Slice layer 的作用是将bottom按照需要分解成多个tops。(与split layer的不一样在于spliit的作用是将bottom复制多份,输出到tops)
首先我们先看一下slice layer 在prototxt里面的书写
-
layer
{
-
name: "slice"
-
type: "Slice"
-
bottom: "input"
-
top: "output1"
-
top: "output2"
-
top: "output3"
-
top: "output4"
-
slice_param {
-
axis: 1
-
slice_point: 1
-
slice_point: 3
-
slice_point: 4
-
}
-
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
这里假设input的维度是N*5*H*W
,tops输出的维度分别为N*1*H*W
N*2*H*W
N*1*H*W
N*1*H*W
。
这里需要注意的是,如果有slice_point,slice_point的个数一定要等于top的个数减一。
axis表示要进行分解的维度。
slice_point的作用是将axis按照slic_point 进行分解。
slice_point没有设置的时候则对axis进行均匀分解。
-
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:
100
-
slice_point:
150
-
}
-
}
其中slice_point的个数必须等于top的个数减一。
输入的data_all维度为 250×3×24×24250×3×24×24