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

聲明:Caffe 系列文章是咱們實驗室 黃佳斌 大神所寫的內部學習文檔,已經得到他的受權容許。python

本參考資料是在 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 ResNetide

  上圖顯示了網絡主體框架,能夠看到一個殘差模塊(Fig 2)是由兩層卷積再加一個恆等映射組成的。相同顏色塊之間的 feature map 的大小是同樣的,所以殘差模塊的輸入輸出的維度大小也是同樣,能夠直接進行相加(如 Fig 1中的實曲線)網絡延伸到不一樣顏色塊時都要通過2倍下采樣或者是 stride=2 的卷積,那麼這時 feature map 的大小都會減半,可是卷積核的數量會增長一倍,這樣是爲了保持時間的複雜度,那麼殘差模塊的輸入和輸出大小不同的時應該要怎麼辦?這裏採用論文中的 B 方法:用 1X1 的卷積核來映射到跟輸出同樣的維度(如 Fig 1中的虛曲線)。ResNet 的大致結構是仍是參照 VGG 網絡。學習

Fig 2 殘差模塊測試

  本參考資料是搭建論文中 CIFAR10 實驗的 ResNet,總共 20 層。結構以下:spa

Layer_name3d

Output_sizecode

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

相關文章
相關標籤/搜索