1. 程式人生 > >【caffe學習筆記】vision layer 特徵表達層

【caffe學習筆記】vision layer 特徵表達層

vision layer 特徵表達層 Header: ./include/caffe/vision_layers.hpp 特徵表達層通常將影象作為輸入,併產生其他影象作為輸出。 vision_layer主要是影象卷積的操作,像convolusion、pooling、LRN都在裡面。 典型“image”可以是灰度影象中的一個顏色通道(c = 1)或者如在RGB(紅色,綠色,藍色)中的三個顏色通道(c = 3 )。 但在caffe中,影象是一個廣義的概念,區別特徵是其空間結構:通常影象的h>1,w>1, 高和寬通常均大於 1而通道數不限,類似結構的資料均可理解為影象 大多數視覺層通常是在輸入資料的某塊區域執行特定操作來產生對應的輸出。 相比之下,其他層(有少數例外)忽略輸入的空間結構,
 而是把輸入影象當作是維度為chw的“一個大向量” 卷積層
  • CPU implementation: ./src/caffe/layers/convolution_layer.cpp
  • CUDA GPU implementation: ./src/caffe/layers/convolution_layer.cu
引數 Required(必須的引數)
  • num_output (c_o): 指定卷積核的數量
  • kernel_size (or kernel_h and kernel_w):指定每個卷積核的高度和寬度
Strongly Recommended(強力推薦)
  • weight_filler  [default 
    type: 'constant' value: 0]:引數的初始化方法
Optional(可選的)
  • bias_term [default true]: 指定是否學習並將一組加性偏差應用於濾波器輸出  指定是否給卷積輸出新增偏置項
  • pad (or pad_h and pad_w) [default 0]:  指定在輸入的每一邊加上多少個畫素  指定在輸入影象周圍補 0 的畫素個數
  • stride (or stride_h and stride_w) [default 1]: 指定過濾器的步長  指定卷積核在輸入 影象上滑動的步長
  • group (g) [default 1]: ( 指定分組卷積操作的組數,預設為 1 即不分組)If g > 1, 我們可以將卷積核的連線限制為輸入資料的一個子集。 具體地說, 輸入影象和輸出影象在通道維度上分別被分成 g 個組, 輸出影象的第 i 組只與輸入影象第 i 組連線( 即輸入影象的第 i 組與相應的卷積核卷積得到第 i組輸出)。
輸入
  • n * c_i * h_i * w_i
輸出
  • n * c_o * h_o * w_o, where h_o = (h_i + 2 * pad_h - kernel_h) / stride_h + 1 and w_o likewise.
例子(./models/bvlc_reference_caffenet/train_val.prototxt layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"   #  卷積核的區域性學習率和權值衰減因子   param { lr_mult: 1 decay_mult: 1 }   # 偏置項的區域性學習率和權值衰減因子   param { lr_mult: 2 decay_mult: 0 }
  convolution_param {
    num_output: 96    #  學習 96 組卷積核     kernel_size: 11    # 卷積核大小為 11x11     stride: 4          # 卷積核滑動步長為 4     weight_filler {       type: "gaussian" # 使用高斯分佈隨機初始化卷積核       std: 0.01        # 高斯分佈的標準差為 0.01 (預設均值: 0)     }
    bias_filler {
      type: "constant" # 使用常數 0 初始化偏置項 0       value: 0
    }
  }
} 卷積層使用一系列可訓練的卷積核對輸入影象進行卷積操作,每組卷積核生成輸出影象中的一個特徵圖。 池化層
  • CPU implementation: ./src/caffe/layers/pooling_layer.cpp
  • CUDA GPU implementation: ./src/caffe/layers/pooling_layer.cu
引數 Required(必須的引數)
  • kernel_size (or kernel_h and kernel_w):指定池化視窗的高度和寬度
Optional(可選的)
  • pool [default MAX]: 池化方法。目前有 MAX AVE STOCHASTIC 三種方法( 最大值池化, 均值池化,和 隨機池化
  • pad (or pad_h and pad_w) [default 0]:  指定在輸入的每一邊加上多少個畫素  指定在輸入影象周圍補 0 的畫素個數
  • stride (or stride_h and stride_w) [default 1]:  指定過濾器的步長  指定池化視窗在輸入資料上滑動的步長
輸入
  • n * c * h_i * w_i
輸出
  • n * c * h_o * w_o, whereh_o and w_o are computed in the same way as convolution.
例子(./models/bvlc_reference_caffenet/train_val.prototxt layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {     pool: MAX     kernel_size: 3 # 池化視窗大小為 3x3     stride: 2      # 池化視窗在輸入影象上滑動的步長為 2   }
} Local Response Normalization (LRN) 區域性相應歸一化層 區域性響應值歸一化層通過對輸入資料的區域性歸一操作執行了一種“側抑制”的機制。 濾波器後面接非線性演算法影響識別率,區域性歸一化層也會增加效能,因為它可以使監督學習演算法更快,也許是因為所有的變數都具有相似的方差了(與其他白化和去相關的方法的優點一樣),這樣會加快收斂速度。 有兩種不同的形式,一種的輸入區域為相鄰的channels(across channel LRN),另一種是為同一個channel內的空間區域(within channel LRN): ACROSS_CHANNELS模式下(通道間歸一化模式)中,區域性區域範圍在相鄰通道間,但沒有空間擴充套件(即區域性區域的尺寸為 local_size x 1 x 1); WITHIN_CHANNEL 模式下(通道內歸一化模式)中,區域性區域在空間上擴充套件,但只針對獨立通道進行(即尺寸為 1 x local_size x local_size); 計算公式:對每一個輸入除以其中n為區域性尺寸大小local_size 在以當前輸入值為中心的區域內計算加和, alpha和beta前面已經定義。
  • CPU Implementation: ./src/caffe/layers/lrn_layer.cpp
  • CUDA GPU Implementation: ./src/caffe/layers/lrn_layer.cu
引數 Optional(可選的)
  • local_size [default 5]::兩種表示(1)通道間歸一化時表示求和的通道數;(2)通道內歸一化時表示求和方形區域的邊長;預設值為5;
  • alpha [default 1]: 縮放參數 (see below)
  • beta [default 5]: 指數 (see below)
  • norm_region [default ACROSS_CHANNELS]:選擇對相鄰通道間歸一化還是通道內空間區域歸一化,預設為ACROSS_CHANNELS,即通道間歸一化;另一種為WITHIN_CHANNEL在通道間指的是沿著通道維度操作,通道內指的是在特徵圖的二維平面內操作
im2col
  • Im2col 是一個輔助操作, 用來實現影象到“列向量”的轉換。
  • Im2col 用在 CAFFE 早期卷積的矩陣乘法中,即將所有影象塊組成一個矩陣。
在caffe中,執行卷積操作時,將影象中與卷積核作用的影象塊寫成列向量,然後將這些列向量按行的方向依次排開組成一個二維的矩陣,同時,每組卷積核寫成一個行向量,多個輸出通道對應的多組卷積核按列的方向依次排開形成一個二維矩陣,這樣,卷積操作就轉化為矩陣乘法操作。