Caffe 議事(一):從零開始搭建 ResNet 之 殘差網絡結構介紹和數據准備


聲明: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 來搭建網絡。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM