caffe原始碼理解之inner_product_layer
阿新 • • 發佈:2018-11-10
原文地址:https://www.cnblogs.com/dupuleng/articles/4312149.html
在caffe中所謂的Inner_Product(IP) 層即fully_connected (fc)layer,為什麼叫ip呢,可能是為了看起來比較優雅吧。。
從CAFFE_ROOT/examples/mnist/lenet.prototxt中擷取一段假設conv2的輸入是256*27*27,那麼conv2的輸出即50*22*22,conv2的輸入即pool2的輸入,pool2的輸出為50*11*11,即ip1的輸入,ip1的輸出為500*1*1,那麼pool2->ip1的引數個數是多少呢?這裡就要理解好什麼是fully_connected了,即wTx,x為列向量,w的長度與x相同。在本文的例子中x的維度為50*11*11,那麼pool2->ip1的引數個數為500*50*11*11 。50*11*11即是一個有50個通道大小為11*11的圖片,那麼在做完全卷積的時候,需要把對所有通道一起作卷積,即把圖片轉化成一個50*11*11的向量。
即把50個通道的11*11轉換為500個通道的1*1向量。上圖中左邊一列是50個11*11的圖片,右邊的一列為500個1*1的向量。
layers {
name: "conv2"
type: CONVOLUTION
bottom: "pool1"
top: "conv2"
blobs_lr: 1
blobs_lr: 2
convolution_param {
num_output: 50
kernel_size: 5
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layers {
name: "pool2"
type: POOLING
bottom: "conv2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layers {
name: "ip1"
type: INNER_PRODUCT
bottom: "pool2"
top: "ip1"
blobs_lr: 1
blobs_lr: 2
inner_product_param {
num_output: 500
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}