聲明:Caffe 系列文章是我們實驗室 黃佳斌 大神所寫的內部學習文檔,已經獲得他的授權允許。
本參考資料是在 Ubuntu14.04 版本下進行,並且默認 Caffe 所需的環境已經配置好,下面教大家如何搭建 KaiMing He 的 Residual Network(殘差網絡)。
Cite: He K, Zhang X, Ren S, et al. Deep residual learning for image recognition[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 770-778.. Cited by 1330.
1.ResNet結構介紹:
ResNet 的結構如下:
Fig 1 34-layer ResNet
上圖顯示了網絡主體框架,可以看到一個殘差模塊(Fig 2)是由兩層卷積再加一個恆等映射組成的。相同顏色塊之間的 feature map 的大小是一樣的,因此殘差模塊的輸入輸出的維度大小也是一樣,可以直接進行相加(如 Fig 1中的實曲線)網絡延伸到不同顏色塊時都要經過2倍下采樣或者是 stride=2 的卷積,那么這時 feature map 的大小都會減半,但是卷積核的數量會增加一倍,這樣是為了保持時間的復雜度,那么殘差模塊的輸入和輸出大小不一樣的時應該要怎么辦?這里采用論文中的 B 方法:用 1X1 的卷積核來映射到跟輸出一樣的維度(如 Fig 1中的虛曲線)。ResNet 的大體結構是還是參照 VGG 網絡。
Fig 2 殘差模塊
本參考資料是搭建論文中 CIFAR10 實驗的 ResNet,總共 20 層。結構如下:
Layer_name |
Output_size |
20-layer ResNet |
Conv1 |
32 X 32 |
Kernel_size=3 X 3 Num_output = 16 Stride = 1 Pad = 1 |
Conv2_x |
32 X 32 |
{3X3,16; 3X3,16} X 3 |
Conv3_x |
16 X 16 |
{3X3,16; 3X3,16} X 3 |
Conv4_x |
8 X 8 |
{3X3,16; 3X3,16} X 3 |
InnerProduct |
1 X 1 |
Average pooling 10-d fc |
每個 Convx_x 中都含有 3 個殘差模塊,每個模塊的卷積核都是 3X3 大小的,pad 為 1,stride 為 1。Con4_x 的輸出通過 global_average_pooling 映射到 64 個 1X1 大小的 feature map,最后再通過含有 10 個神經元的全連接層輸出分類結果。
2.數據准備
CIFAR10 數據庫介紹:
CIFAR10 數據庫中的圖片大小為 3 X 32 X 32(通道數 X 圖像高度 X 圖像寬度),訓練數據為 50000 張,測試數據為 10000 張。此外還有 CIFAR100,那是分 100 類的圖像數據庫。
Fig 3 CIFAR10 數據庫
我們先在 /home/your_name/ 下建立一個文件夾叫 ResNet,再把 caffe-master 放進去解壓,然后按照如下步驟
Fig 4 把 caffe-maste r放入 ResNet 然后解壓
步驟1:
在 caffe-master (caffe 的根目錄)中找到 Makefile.config.example,復制一份為 Makefile.config。
Fig 5 復制一份Makefile.config
在這個復制好的 Makefile.config 文件中設置好一些參數。由於每個電腦環境不一樣,在這里貼出本實驗方案的設置參數,僅供參考:(僅僅是把 “#” 注釋給去掉)
# USE_CUDNN := 1 變為 USE_CUDNN := 1 # WITH_PYTHON_LAYER := 1 變為 WITH_PYTHON_LAYER := 1
步驟2:
在 caffe-master (caffe 的根目錄)中打開終端,先輸入 make clean(清除之前編譯的文件,雖然還沒編譯過),然后再輸入 make all(重新編譯 caffe),這個過程會很漫長,如果想要加快速度,輸入 make all -j8(j 后面的數字代表加速的倍數,可以是 2,4,8,16 等),最后再輸入 make pycaffe(之后本參考資料會用 python 搭建殘差網絡,因此要生成供 python 調用的接口文件)。
Fig 6 make clean & make all & make pycaffe
步驟3:
在 caffe 的示例程序中有 CIFAR10 的 demo,里面有獲取 CIFAR10 數據程序。在 caffe-master (caffe 的根目錄)中打開終端,輸入:
$./data/cifar10/get_cifar10.sh
為什么要在 caffe 的根目錄里面輸入這個,因為只有在根目錄才有 data 文件,才能按照路徑找到文件,打了指令后會出現下載界面,如下:
Fig 7 下載CIFAR10界面
下載完成后,會在 $(caffe 根目錄)/data/cifar10/ 中生成許多數據 batch,不過這些都是二進制文件,我們需要轉換為 LMDB 格式。
Fig 8 下載后的二進制數據batch
步驟4:
同樣在 caffe-master (caffe 的根目錄)中打開終端,輸入:
$./examples/cifar10/create_cifar10.sh
這樣就把上面的二進制文件轉換成 LMDB 數據,同時生成了訓練數據 (cifar10_train_lmdb) 的均值文件 mean.binaryproto。均值文件的計算方式是計算每個樣本不同維度上的均值,拿 CIFAR10 做例子,訓練數據有 5000 X 3 X 32 X 32 (樣本個數 X 圖像通道數 X 圖像高度 X 圖像寬度),那么均值文件的維度是 3 X 32 X 32。
Fig 9 生成的測試數據,訓練數據,還有均值文件
這樣我們就已經生成數據了,接下來我們就要用 python 來搭建網絡。