1.Normalize層
layer {
name: "conv4_3_norm"
type: "Normalize"
bottom: "conv4_3"
top: "conv4_3_norm"
norm_param {
across_spatial: false
scale_filler {
type: "constant"
value: 20
}
channel_shared: false
}
}
2.Permute層
layer {
name: "conv4_3_norm_mbox_loc_perm"
type: "Permute"
bottom: "conv4_3_norm_mbox_loc"
top: "conv4_3_norm_mbox_loc_perm"
permute_param {
order: 0
order: 2
order: 3
order: 1
}
}
permute是SSD特有的層,功能類似於np.swapaxes,相當於交換caffe_blob中數據的維度。例如,經過conv4_3_norm_mbox_loc_perm層後,caffe裏面blob順序由[batch_size,channels,height,width]變爲[batch_size,height,width,channels]。
3.Flatten層
layer {
name: "conv9_2_mbox_conf_flat"
type: "Flatten"
bottom: "conv9_2_mbox_conf_perm"
top: "conv9_2_mbox_conf_flat"
flatten_param {
axis: 1
}
}
將多維數據拉成向量:Flatten層是把一個輸入的大小爲N*C*H*W變成一個簡單的向量,其大小爲 N*(C*H*W)。當Reshape層的param參數爲:{ shape { dim: 0 dim: -1 } } ,那麼輸出和flatten輸出是完全一樣的。所以,flatten相當於是reshape的特例。
4.Concat層
layer {
name: "mbox_priorbox"
type: "Concat"
bottom: "conv4_3_norm_mbox_priorbox"
bottom: "fc7_mbox_priorbox"
bottom: "conv6_2_mbox_priorbox"
bottom: "conv7_2_mbox_priorbox"
bottom: "conv8_2_mbox_priorbox"
bottom: "conv9_2_mbox_priorbox"
top: "mbox_priorbox"
concat_param {
axis: 2
}
}
按指定維度進行拼接,通過axis指定拼接的維度。caffe中數據通常爲4個維度,即 NCHW,因此默認值1表示channels通道進行拼接。
5.reshape層
layer {
name: "mbox_conf_reshape"
type: "Reshape"
bottom: "mbox_conf"
top: "mbox_conf_reshape"
reshape_param {
shape {
dim: 0
dim: -1
dim: 2 ####12
}
}
}
只改變輸入數據的維度,內容不變。“dim:0”表示維度不變,“dim:2”或“dim:3”表示將原來維度變爲2或3,“dim:-1”表示由系統自動根據之前維度推斷出當前維度。
6.slice層
concat就是合併的操作,那麼slice就是拆分的操作,需要指定的參數是:拆分的通道axis、拆分的位置slice_point
參考文獻: