1. 程式人生 > >Caffe層系列:Slice Layer

Caffe層系列:Slice Layer

Slice Layer 的作用是將bottom按照需要切分成多個tops,一般特點是:一個輸入多個輸出

首先我們先看一下 SliceParameter

message SliceParameter {
  // The axis along which to slice -- may be negative to index from the end
  // (e.g., -1 for the last axis).   //-1表示最後一個維度
  // By default, SliceLayer concatenates blobs along the "channels" axis (1).   //預設按通道切分
  optional int32 axis = 3 [default = 1];
  repeated uint32 slice_point = 2;

  // DEPRECATED: alias for "axis" -- does not support negative indexing. //該引數 已棄用
  optional uint32 slice_dim = 1 [default = 1];
}

slice layer 在prototxt裡面的書寫:

layer {
	  name: "slice"
	  type: "Slice"
	  bottom: "input"   #假設維度:N×5×H*W
	  top: "output1"    #N×1×H*W
	  top: "output2"    #N×2×H*W
	  top: "output3"    #N×1×H*W
	  top: "output4"    #N×1×H*W
	  slice_param {
	    axis: 1   #axis:切分的維度軸; 1:表示按通道切分,CNN網路常用
	    			#slice_point: 表示切分的位置,如當前:
	    slice_point: 1   #1:表示將input從通道1的位置切分,將通道1及之前的通道賦值給output1
	    slice_point: 3   #3:表示將input從通道3的位置切分,將通道3及上一個slice_point之間的通道賦值給output2
	    slice_point: 4   #4:表示將input從通道4的位置切分,將通道4及上一個slice_point之間的通道賦值給output3
						 #最後將通道4之後的通道賦值給output4
  }
}

值得注意的是,如果有slice_point,slice_point的個數一定要等於top的個數-1;有點類似刀切豆腐,同一維度切3刀,得4塊豆腐;
axis表示要進行分解的維度;
slice_point的作用是將axis按照slic_point 進行分解;
slice_point沒有設定的時候則對axis進行均勻分解;

舉個例子:

layer {
	  name: "vec_weight"
	  type: "Slice"
	  bottom: "label"     #N×114×H*W
	  top: "vec_weight"
	  top: "heat_weight"
	  top: "vec_temp"
	  top: "heat_temp"
	  slice_param {
	    slice_point: 38
	    slice_point: 57
	    slice_point: 95
	    axis: 1
	  }
}

top輸出:

  top: "vec_weight"   #N×38×H*W
  top: "heat_weight"  #N×19×H*W
  top: "vec_temp"     #N×38×H*W
  top: "heat_temp"    #N×19×H*W