{承接CNN學習入門,筆者在這裏對Caffe官方網站上的相關介紹進行了翻譯總結,歡迎大家交流指正}
本文基於此刻最新的release,Caffe-rc3:
Layers:
建立Caffe模型需要在protocol buffer的definition file即.prototxt文件中創建網絡模型。
.prototxt文件中,層及層參數的解釋方法又被定義在caffe.proto(src/caffe/proto)文件中。
1. Vision Layer:
頭文件:./include/caffe/vision_layers.hpp
Vision Layer通常將images作爲input並將生成其他images作爲output。
現實生活中,images通常含有一個顏色通道(C = 1),所謂的灰度圖像,或者三個通道(C = 3),所謂的RGB(Red Green Blue)圖像。但在此文中,圖像區別性的特徵體現在它的空間結構上:一般的一張圖片Height > 1同時Width > 1。這些2維的幾何學特徵將會自然而然的引出如何處理輸入數據。
特別地,大多數的vision layer都將一些特殊操作應用於輸入的一些特定區域,來產生對應位置的輸出。
與之相反,其他層(幾乎沒有例外)忽略了輸入的空間特徵,將其視爲"超大的一維向量(one big vector)",維度是Channel x Height x Width。
Convolution:
1.網絡類型:Convolution
2.CPU版本實現:./src/caffe/layers/convolution_layer.cpp
3.GPU版本實現:./src/caffe/layers/convolution_layer.cu
4.參數(ConvolutionParameter convolution_param):
4.1 Required:
4.1.1 num_output(c_o):filters的數目或者說是卷積kernel的數目
4.1.2 kernel_size(Or kernel_h and kernel_w):每個卷積核的height和width
4.2 Strongly Recommended
4.2.1 weight_filler[default type:'constant' value 0]
4.3 Optional
4.3.1 bias_term[default true]:卷積輸出是否加偏置 Wx + bias 中的 bias
4.3.2 pad(Or pad_h and pad_w)[default 0]:對上下左右四側padding zero的行列數目 默認不padding
4.3.3 stride(Or stride_h and stride_w)[default 1]:指定filter的作用間隔 默認間隔1個像素
4.3.4 group(g)[default 1]:if g > 1:我們將限制每個filter只能連接到input的子集,即input和output的channels都被分到g個group,第i個output group的channels只能和第i個input group的channels相連接。
5.輸入:n * c_i * h_i * w_i
6.輸出:n * c_o * h_o * w_o, h_o = (h_i + 2*pad_h - kernel_h) / stride_h , w_o算法類似。
7.示例:
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
# learning rate and decay multipliers for the filters
param { lr_mult: 1 decay_mult: 1 }
# learning rate and decay multipliers for the biases
param { lr_mult: 2 decay_mult: 0 }
convolution_param {
num_output: 96 # learn 96 filters
kernel_size: 11 # each filter is 11x11
stride: 4 # step 4 pixels between each filter application
weight_filler {
type: "gaussian" # initialize the filters from a Gaussian
std: 0.01 # distribution with stdev 0.01 (default mean: 0)
}
bias_filler {
type: "constant" # initialize the biases to zero (0)
value: 0
}
}
}
Convolution layer將input image用一組權值可通過反傳調整的filter(即卷積核)進行卷積,每個卷積核都將生成一個feature map,多個feature map堆疊形成ouput。
Pooling:
1.網絡類型:Pooling
2.CPU版本實現:./src/caffe/layers/pooling_layer.cpp
3.GPU版本實現:./src/caffe/layers/pooling_layer.cu
4.參數(PoolingParameter pooling_param):
4.1 Required:
4.1.1 kernel_size(Or kernel_h and kernel_w):每個卷積核的height和width
4.2 Optional
4.2.1 pool[default MAX]:pooling的方法,當前有MAX,AVE,or STOCHASTIC
4.2.2 pad(Or pad_h and pad_w)[default 0]:對上下左右四側padding zero的行列數目 默認不padding
4.2.3 stride(Or stride_h and stride_w)[default 1]:指定filter的作用間隔 默認間隔1個像素
5.輸入:n * c * h_i * w_i
6.輸出:n * c * h_o * w_o, h_o = (h_i + 2*pad_h - kernel_h) / stride_h , w_o算法類似。
7.示例:
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3 # pool over a 3x3 region
stride: 2 # step two pixels (in the bottom blob) between pooling regions
}
}
1.網絡類型:LRN
2.CPU版本實現:./src/caffe/layers/lrn_layer.cpp
3.GPU版本實現:./src/caffe/layers/lrn_layer.cu
4.參數(LRNParameter lrn_param):
4.1 Optional
4.1.1 local_size[default 5]:用於求和的channel的數目(對應於cross channel LRN)
或用於求和的方形區域的邊界長度(對應於within channel LRN)
4.1.2 alpha[default 1]:縮放係數
4.1.3 beta[default 5]:指數
4.1.4 norm_region[default ACROSS_CHANNELS]:是對相鄰channels求和(ACROSS_CHANNELS)還是在空間上對相鄰位置求和(WITHIN_CHANNEL)
LRN層起到一種側抑制的作用,通過對局部input區域的標準化。在ACROSS_CHANNELS mode,local region跨過相鄰的channels,但是在空間維度保持不變(舉例而言,維度爲local_size x 1 x 1)。在WITHIN_CHANNEL mode,local region在空間維度進行擴展,但是channel仍保持獨立(舉例而言,維度爲1 x local_size x local_size)。每一個input value都被除以(1+(alpha/n)*sum(x_i.^2))^beta,這裏的n代表每個local region的大小,sum是對以該input value爲中心的region進行求和(如果有需要的話需要進行zero padding)。
im2col:
Im2col是爲了方便進行image-to-column變形的,具體細節無需瞭解。它被用在Caffe原始的convolution的矩陣乘法操作中,將patches轉化成矩陣。