admin管理员组文章数量:1568309
contact解析
Concat层的作用就是将两个及以上的特征图按照在channel或num维度上进行拼接,并没有eltwise层的运算操作,举例,如果说在channel维度上进行拼接的话,首先除了channel维度可以不一样,其余维度必须一致(也就是num、H、W一致),以Caffe为例,介绍一下这两种拼接的方式,如下:
caffe中数据通常为4个维度,即 num×channels×height×width,因此默认值1表示channels通道进行拼接。
- 选择axis=0,表示在num维度上进行拼接,可表示为:(k1+k2)*C*H*W;
- 选择axis=1,表示在channel维度上进行拼接,可表示为:N*(k1+k2)*H*W。
layer {
name: "data_all"
type: "Concat"
bottom: "data_classfier"
bottom: "data_boundingbox"
bottom: "data_facialpoints"
top: "data_all"
concat_param {
axis: 0
}
}
除了拼接维度外的其它维度都必须相等。比如上面,输入图像均为 24×24×3,用于分类的有150张图片,用于boundingbox回归的有50张,用于关键点回归的也有50张,则最后拼接的结果就是 (150+50+50)×3×24×24
slice解析
slice层可根据给定的维度将bottom切分成多个top,用于具有多个输入多任务的网络。slice层有三个参数,axis和slice_dim用于指定切分的维度是什么,默认为1,切分channel维度,还有另一个选择就是切分num,类似于Concat层,但是注意这两个参数只能指定一个,常用axis。第三个参数就是指定从哪里开始切分,怎么切分?这个参数就是slice_point,因此slice层的运用格式为:
layer {
name: "slicelayer"
type: "Slice"
bottom: "labels"
top: "labels1"
top: "labels2"
top: "labels3"
top: "labels4"
top: "labels5"
top: "labels6"
top: "labels7"
top: "labels8"
slice_param {
axis: 1
slice_point: 1
slice_point: 2
slice_point: 3
slice_point: 4
slice_point: 5
slice_point: 6
slice_point: 7
}
}
解释一下,labels是由8个数字组成的,所以8个任务要切分成8个label,labels之间每隔1为一个label,切7次就搞定了,所以注意slice_point的个数要比top的个数少一个。
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
多数据多标签多任务
假设有data_1/data_2/_data_3三个数据,data_1/data_2用于训练任务一,data_3用于训练任务二,data_1/data_2的label为多标签(多任务),结构类似下图:
描述文件可以参考下面:
layer {
name: "data_1"
type: "Data"
top: "data_1"
top: "label_1"
include {
phase: TRAIN
}
transform_param {
mirror: false
mean_value: 127.5
scale: 0.0078125
}
data_param {
source: "data01_train_lmdb"
batch_size: 64
backend: LMDB
}
}
layer {
name: "data_1"
type: "Data"
top: "data_1"
top: "label_1"
include {
phase: TEST
}
transform_param {
mirror: false
mean_value: 127.5
scale: 0.0078125
}
data_param {
source: "data01_test_lmdb"
batch_size: 64
backend: LMDB
}
}
layer {
name: "data_2"
type: "Data"
top: "data_2"
top: "label_2"
include {
phase: TRAIN
}
transform_param {
mirror: false
mean_value: 127.5
scale: 0.0078125
}
data_param {
source: "data02_train_lmdb"
batch_size: 24
backend: LMDB
}
}
layer {
name: "data_2"
type: "Data"
top: "data_2"
top: "label_2"
include {
phase: TEST
}
transform_param {
mirror: false
mean_value: 127.5
scale: 0.0078125
}
data_param {
source: "data02_test_lmdb"
batch_size: 24
backend: LMDB
}
}
##将data_1/data_2 contact
layer {
name: "data_task01"
type: "Concat"
bottom: "data_1"
bottom: "data_2"
top: "data_task01"
concat_param {
axis: 0
}
}
##将data_1/data_2标签合并
layer {
name: "label_task01"
type: "Concat"
bottom: "label_1"
bottom: "label_2"
top: "label_task01"
concat_param {
axis: 0
}
}
##将data_1/data_2合并后的多标签按照任务slice
layer {
name: "label_task01_slice"
type: "Slice"
bottom: "label_task01"
top: "label_t01"
top: "label_t02"
slice_param {
axis: 1
}
}
layer {
name: "data_3"
type: "Data"
top: "data_3"
top: "label_3"
include {
phase: TRAIN
}
transform_param {
mirror: false
mean_value: 127.5
scale: 0.0078125
#crop_size: 24
}
data_param {
source: "data03_train_lmdb"
batch_size: 24
backend: LMDB
}
}
layer {
name: "data_3"
type: "Data"
top: "data_3"
top: "label_3"
include {
phase: TEST
}
transform_param {
mirror: false
mean_value: 127.5
scale: 0.0078125
#crop_size: 24
}
data_param {
source: "data03_test_lmdb"
batch_size: 24
backend: LMDB
}
}
##将多数据contact
layer {
name: "data"
type: "Concat"
bottom: "data_task01"
bottom: "data_3"
top: "data"
concat_param {
axis: 0
}
}
###########省略中间卷积层#########
###########多任务slice############
layer {
name: "slice"
type: "Slice"
bottom: "fc"
top: "output_task01"
top: "output_task02"
slice_param {
axis: 0
#若无下面语句,则默认平均slice
#data_3的batch_size需等于 data_1/data_2 batch_size之和
#否则需要从data_1/data_2 batch_size之和处划分
slice_point:88
}
}
参考:
1.https://wwwblogs/cvtoEyes/p/8602739.html
2.https://wwwblogs/cvtoEyes/p/8623287.html
3.https://blog.csdn/shuzfan/article/details/54565776
版权声明:本文标题:caffe:contact及slice层用法说明实现多数据、多标签、多任务 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1726641091a1079652.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论