1. 程式人生 > >caffe訓練網路的實踐

caffe訓練網路的實踐

  Caffe現如今已經成為了深度學習一個非常火的框架。但是作為剛接觸CNN或者caffe的小白可能對caffe的介面或者細節不是很清楚瞭解。本文作為嘗試著利用caffe做一個簡單的圖片分類model,希望能夠與大家快速入門caffe訓練屬於自己的資料。

  首先,要準備自己的資料集。這次任務是訓練手寫的文字。請注意,並不是手寫集Mnist,區別在於是手寫完整的一頁作為一類。一共有6類。肉眼看區別很小。下圖為資料的描述性資訊,並且每一類選出了一張圖片展示給大家。

                            

  在用caffe進行分類之前。我們要對它進行標註,訓練集測試集劃分,並且將他們的圖片尺寸進行統一

。我們作為一次簡單的實踐,投機取巧,將它設定成256 * 256  imagenet標準格式(利用imagenet網路訓練)。

  關於標註,在標註環節,我將圖片按照不同類別放入不同索引,按照訓練集:測試集=9:1的比例關係劃分了,train和val兩個目錄。

  用一個Python指令碼將其進行標註類別(形式無所謂,結果相同即可)。

                                                           效果如下圖:圖片名在前,類別在後。

                                                                       


  尺寸方面,如果在linux的環境下,我們可以很容易的呼叫convert 命令給圖片進行 –resize. 參考語句如下:

                                                                 convert –resize 256x256 a.jpg a.jpg

  如果我們需要轉換成mnist需要的單通道灰度圖的話,我們還可以如下語句將其進行灰度轉化:

                                                                 convert -monochrome a.jpg a.jpg

  建議做成sh 指令碼,對圖片進行批量的操作。

  下面,我們就可以盡情的呼叫caffe給我們留下的指令碼,熟悉caffe流程。二來,利用前輩們的網路訓練我們的資料。在這裡,我們利用imagenet的網路。我們切換到/caffe-master/examples/imagenet 的路徑下。

  第一步,我們需要明確,caffe在執行時需要的資料型別是lmdb和leveldb. 這個實現在了convert_imageset.cpp中。但是我們可以直接呼叫他們留下的sh指令碼create_imagenet.sh。請注意改變一下各個路徑(建議寫絕對路徑,不然每一次呼叫都需要在caffe-master下執行,非常麻煩)。當我們轉化成caffe需要的資料格式lmdb之後目錄下就會出現兩個目錄,一個是訓練的目錄,一個是測試的目錄。

                                                               mydata_val_lmdb   mydata_train_lmdb

  下一步,我們需要計算均值,我們再一次呼叫make_imagenet_mean.sh。他會輸出一個mydata_mean.binaryproto.至此,我們所有的準備工作宣告完成。下面就可以訓練了。

  訓練階段,我們先去找/caffe-master/models/bvlc_reference_caffenet

路徑下的solver.prototxt 修改我們的資料路徑。另外就本次實驗而言,如果GPU計算能力不是很足我建議將其中max_iter ,test_iter改一改。儘量改小一點,原因是是資料集量很小几百次iter就可以遍歷所有圖片不值得這麼多迭代浪費計算量。我們注意到腳本里面呼叫了train_val.prototxt,所以有必要再看一眼train_val.prototxt。

layer {
  name: "fc8"
  type: "InnerProduct"
  bottom: "fc7"
  top: "fc8"
  param {
    lr_mult: 1
    decay_mult: 1
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  inner_product_param {
    num_output: 6
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}


一是定義一下資料的路徑,改一下最後的num_output,二來,我們可以窺探一下網路結構(比minst)複雜得多,為了以後做結構的研究做好準備。

一切就緒之後,我們就啟動train_caffenet.sh 讓他盡情的run吧。

                                                              下面附上一張GPU策馬奔騰奔跑的圖片:)


Tips:這一次的網路是imagenet,也許執行的時間會很長。實驗室的GPU只有一個K20在苦苦支撐。所以,如果你遇到這種情況,可以觀察他的loss如果loss趨於平緩,沒有絲毫降低的意思。我們可以將它提前終止。之後我們就可以看到他的執行出來的model。

          

我們也可以看他的日誌大體看一下val資料的準確率。

從圖上看,這一次訓練結果還是不錯的。如果還想提升準確率的話,就需要從別的地方下手啦。

參考文件:

因為caffe用到了proto。類似於XML但是高效的配置檔案。所以有時間建議看一下

下一次,我們將嘗試利用訓練出來的model做一下這種資料的分類。以及寫程式碼檢測一下top3的準確率~~~