最近一段时间MultiTask网络比较流行,比如做人脸检测的时候,一个网络完成(人脸和非人脸)二分类任务的同时也要进行boudingbox回归或者人脸关键点回归。
以人脸检测MTCNN为例,一个网络包含三个任务。训练的时候,一个batch中的图片,一部分用于二分类、一部分用于boundingbox 回归,一部分用于关键点回归。这种较复杂的样本组合完全可以通过slice和concat层来快速实现。
———————— Concat —————————
concat层实现输入数据的拼接。
该层有两个相同作用的参数:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
caffe中数据通常为4个维度,即 num×channels×height×width ,因此默认值1表示channels通道进行拼接。
使用方法如下
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
除了拼接维度外的其它维度都必须相等。比如上面,输入图像均为 24×24×3 ,用于分类的有150张图片,用于boundingbox回归的有50张,用于关键点回归的也有50张,则最后拼接的结果就是 (150+50+50)×3×24×24
————————— Slice —————————
既然有合并,那么相应的也有拆分。slice层共有三个参数:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
现在我们就要把之前concat合并的数据按照原样拆分:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
其中slice_point的个数必须等于top的个数减一。输入的data_all维度为 250×3×24×24 ,拆分后的3个输出的维度依次为 150×3×24×24 , 50×3×24×24 , 50×3×24×24
————————— MultiTask —————————
下面直接给一张网络结构图,大家就应该知道怎么实现多数据MultiTask了。