admin管理员组

文章数量:1529463

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

本文标签: 标签caffeContactslice