原文鏈接:caffe.berkeleyvision.org/tutorial/layers.html
創建caffe模型,首先要在protocol buffer 定義文件(prototxt)中定義結構。
在caffe環境中,圖像的明顯特征是其空間結構。
主要layers |
主要功能 |
主要類型 |
其他 |
卷積層 |
提取特征 |
CONVOLUTION |
學習率、數據維度 |
池化層 |
特征池化 |
POOLING |
池化方法,數據維度 |
局部響應歸一化層 |
臨近抑制 |
LRN |
|
損失計算層 |
loss計算 |
SOFTMAX_LOSS EUCLIDEAN_LOSS HINGE_LOSS ACCURACY正確率 |
選擇合適的loss 范數可選 |
激勵層 |
非線性函數 |
ReLU SIGMOID TANH ABSVAL POWER BNLL |
ReLU收斂更快 |
數據層 |
數據源 |
Level-DB LMDB HDF5_DATA HDF5_OUTPUT IMAGE_DATA |
Level-DB和LMDB更加高效
|
一般層 |
|
INNER_PRODUCT 全連接層 SPLIT FLATTEN 類似shape方法 CONCAT ARGMAX MVN |
|
一、卷積層 Convolution:
Documents:注意維度變化與參數選擇
1 Parameters (ConvolutionParameter convolution_param) 2 3 Required 4 num_output (c_o): 輸出數(filter數) 5 kernel_size (or kernel_h and kernel_w): 指定卷積核 6 7 Strongly Recommended 8 weight_filler [default type: 'constant' value: 0] 9 10 Optional 11 bias_term [default true]: 指定是否提供偏置10 12 pad (or pad_h and pad_w) [default 0]: 指定輸入圖片的兩側像素填充量 13 stride (or stride_h and stride_w) [default 1]: 過濾器步長 14 group (g) [default 1]: 如果 g > 1, 我們限制每一個filter之間的連通性 對於輸入的子集. 指定輸入和輸出被分為 g 組,第i輸出組只會和第i輸入組相連接. 15 16 Input 17 18 n * c_i * h_i * w_i 19 20 Output 21 22 n * c_o * h_o * w_o, where h_o = (h_i + 2 * pad_h - kernel_h) / stride_h + 1 and w_o likewise.
example:
1 layers { 2 name: "conv1" 3 type: CONVOLUTION 4 bottom: "data" 5 top: "conv1" 6 blobs_lr: 1 # learning rate multiplier for the filters 7 blobs_lr: 2 # learning rate multiplier for the biases 8 weight_decay: 1 # weight decay multiplier for the filters 9 weight_decay: 0 # weight decay multiplier for the biases 10 convolution_param { 11 num_output: 96 # learn 96 filters 12 kernel_size: 11 # each filter is 11x11 13 stride: 4 # step 4 pixels between each filter application 14 weight_filler { 15 type: "gaussian" # initialize the filters from a Gaussian 16 std: 0.01 # distribution with stdev 0.01 (default mean: 0) 17 } 18 bias_filler { 19 type: "constant" # initialize the biases to zero (0) 20 value: 0 21 } 22 } 23 }
二、池化層 Pooling:
參考鏈接 deeplearning.stanford.edu/wiki/index.php/池化
池化: 概述
在通過卷積獲得了特征 (features) 之后,下一步我們希望利用這些特征去做分類。理論上講,人們可以用所有提取得到的特征去訓練分類器,例如 softmax 分類器,但這樣做面臨計算量的挑戰。例如:對於一個 96X96 像素的圖像,假設我們已經學習得到了400個定義在8X8輸入上的特征,每一個特征和圖像卷積都會得到一個 (96 − 8 + 1) * (96 − 8 + 1) = 7921 維的卷積特征,由於有 400 個特征,所以每個樣例 (example) 都會得到一個 892 * 400 = 3,168,400 維的卷積特征向量。學習一個擁有超過 3 百萬特征輸入的分類器十分不便,並且容易出現過擬合 (over-fitting)。
為了解決這個問題,首先回憶一下,我們之所以決定使用卷積后的特征是因為圖像具有一種“靜態性”的屬性,這也就意味着在一個圖像區域有用的特征極有可能在 另一個區域同樣適用。因此,為了描述大的圖像,一個很自然的想法就是對不同位置的特征進行聚合統計,例如,人們可以計算圖像一個區域上的某個特定特征的平 均值 (或最大值)。這些概要統計特征不僅具有低得多的維度 (相比使用所有提取得到的特征),同時還會改善結果(不容易過擬合)。這種聚合的操作就叫做池化 (pooling),有時也稱為平均池化或者最大池化 (取決於計算池化的方法)。
參數解釋:
1 Required 2 kernel_size (or kernel_h and kernel_w):池化核 3 Optional 4 pool [default MAX]:指定池化方法. MAX, AVE, or STOCHASTIC(按照概率值大小隨機選擇,數值大的被選中的概率大) 5 pad (or pad_h and pad_w) [default 0]: 指定輸入圖片的兩側像素填充量 6 stride (or stride_h and stride_w) [default 1]:過濾器步長 7 Input 8 n * c * h_i * w_i 9 Output 10 n * c * h_o * w_o,where h_o = (h_i + 2 * pad_h - kernel_h) / stride_h + 1 and w_o likewise..
示例:
1 layers { 2 name: "pool1" 3 type: POOLING 4 bottom: "conv1" 5 top: "pool1" 6 pooling_param { 7 pool: MAX 8 kernel_size: 3 # 3*3 區域池化 9 stride: 2 # (in the bottom blob) between pooling regions 10 } 11 }