Caffe使用step by step:caffe框架下的基本操作和分析

 caffe雖然已經安裝了快一個月了,但是caffe使用進展比較緩慢,果然如劉老師說的那樣,搭建起來caffe框架環境比較簡單,但是完整的從數據準備->模型訓練->調參數->合理結果需要一個比較長的過程,這個過程中你需要對caffe中很多東西,細節進行深入的理解,這樣纔可以知道爲什麼能有這樣的結果,在訓練或者fine-tuning時知道針對調整的方法。下面針對caffe中的使用進行講解。

  在使用過程中,caffe官網上提供了詳細的使用說明,如果感覺仍然存在一些困難,可以使用谷歌或百度搜索自己遇到的問題和想要了解的過程進行搜索學習。

 

一、Caffe模型基本組成

想要訓練一個caffe模型,需要配置兩個文件,包含兩個部分:網絡模型,參數配置,分別對應***.prototxt , ****_solver.prototxt文件

Caffe模型文件講解:

  1. 預處理圖像的leveldb構建 
    輸入:一批圖像和label (2和3) 
    輸出:leveldb (4) 
    指令裏包含如下信息:
    1. conver_imageset (構建leveldb的可運行程序)
    2. train/ (此目錄放處理的jpg或者其他格式的圖像)
    3. label.txt (圖像文件名及其label信息)
    4. 輸出的leveldb文件夾的名字
    5. CPU/GPU (指定是在cpu上還是在gpu上運行code)
  2. CNN網絡配置文件

    1. Imagenet_solver.prototxt (包含全局參數的配置的文件)
    2. Imagenet.prototxt (包含訓練網絡的配置的文件)
    3. Imagenet_val.prototxt (包含測試網絡的配置文件)

       

網絡模型:即定義你網絡的每一層,下圖是用caffe中 /python/draw_net.py畫出的的siamese的模型,非常清晰

層包含:(以LeNet爲例)

DATA:一般包括訓練數據測試數據層兩種類型。 一般指輸入層,包含source:數據路徑,批處理數據大小batch_size,scale表示數據表示在[0,1],0.00390625即 1/255

訓練數據層:

複製代碼
layer {
  name: "mnist"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    scale: 0.00390625
  }
  data_param {
    source: "examples/mnist/mnist_train_lmdb"
    batch_size: 64
    backend: LMDB
  }
}
複製代碼

測試數據層:

複製代碼
layer {
  name: "mnist"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    scale: 0.00390625
  }
  data_param {
    source: "examples/mnist/mnist_test_lmdb"
    batch_size: 100
    backend: LMDB
  }
}
複製代碼

 

CONVOLUATION:卷積層,blobs_lr:1 , blobs_lr:2分別表示weight 及bias更新時的學習率,這裏權重的學習率爲solver.prototxt文件中定義的學習率真,bias的學習率真是權重學習率的2倍,這樣一般會得到很好的收斂速度。

num_output表示濾波的個數,kernelsize表示濾波的大小,stride表示步長,weight_filter表示濾波的類型

複製代碼
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1 //weight學習率
  }
  param {
    lr_mult: 2 //bias學習率,一般爲weight的兩倍
  }
  convolution_param {
    num_output: 20  //濾波器個數
    kernel_size: 5
    stride: 1  //步長
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
複製代碼

 

POOLING: 池化層

複製代碼
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 2 
    stride: 2
  }
}
複製代碼

 

INNER_PRODUCT: 其實表示全連接,不要被名字誤導

複製代碼
layer {
  name: "ip1"
  type: "InnerProduct"
  bottom: "pool2"
  top: "ip1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 500 
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
複製代碼

 

RELU:激活函數,非線性變化層 max( 0 ,x ),一般與CONVOLUTION層成對出現

layer {
  name: "relu1"
  type: "ReLU"
  bottom: "ip1"
  top: "ip1"
}

 

SOFTMAX

複製代碼
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "ip2"
  bottom: "label"
  top: "loss"
}
複製代碼

 

參數配置文件:

***_solver.prototxt文件定義一些模型訓練過程中需要到的參數,比較學習率,權重衰減係數,迭代次數,使用GPU還是CPU等等

複製代碼
# The train/test net protocol buffer definition
net: "examples/mnist/lenet_train_test.prototxt"

# test_iter specifies how many forward passes the test should carry out.
# In the case of MNIST, we have test batch size 100 and 100 test iterations,
# covering the full 10,000 testing images.
test_iter: 100

# Carry out testing every 500 training iterations.
test_interval: 500

# The base learning rate, momentum and the weight decay of the network.
base_lr: 0.01
momentum: 0.9
weight_decay: 0.0005

# The learning rate policy
lr_policy: "inv"
gamma: 0.0001
power: 0.75

# Display every 100 iterations
display: 100

# The maximum number of iterations
max_iter: 10000

# snapshot intermediate results
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"

# solver mode: CPU or GPU
solver_mode: GPU
device_id: 0  #在cmdcaffe接口下,GPU序號從0開始,如果有一個GPU,則device_id:0
複製代碼

 訓練出的模型被存爲***.caffemodel,可供以後使用。

 

二、使用caffe訓練模型包含以下幾個步驟:

  1. 準備數據

    在caffe中使用數據來對機器學習算法進行訓練時,首先需要了解基本數據組成。不論使用何種框架進行CNNs訓練,共有3種數據集:

    • Training Set:用於訓練網絡
    • Validation Set:用於訓練時測試網絡準確率
    • Test Set:用於測試網絡訓練完成後的最終正確率
  2. 重建lmdb/leveldb文件,caffe支持三種數據格式輸入:images, levelda, lmdb

    Caffe生成的數據分爲2種格式:Lmdb和Leveldb

    • 它們都是鍵/值對(Key/Value Pair)嵌入式數據庫管理系統編程庫。
    • 雖然lmdb的內存消耗是leveldb的1.1倍,但是lmdb的速度比leveldb快10%至15%,更重要的是lmdb允許多種訓練模型同時讀取同一組數據集。
    • 因此lmdb取代了leveldb成爲Caffe默認的數據集生成格式。
  3. 定義name.prototxt , name_solver.prototxt文件
  4. 訓練模型

三、caffe中比較有用且基礎的接口(cmdcaffe)

注:在使用cmdcaffe時,需要默認切換到Caffe_Root文件夾下

1、訓練模型,以mnist爲例子

./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt

注:caffe官網上給的例子不能直接執行,需要使用上述命令纔可以使用tools下的caffe接口,因爲caffe默認都需要從根目錄下面執行文件。

2、觀察各個階段的運行時間可以使用

./build/tools/caffe time --model=models/bvlc_reference_caffenet/train_val.prototxt

3、使用已有模型提取特徵

./build/tools/extract_features.bin models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel examples/_temp/imagenet_val.prototxt conv5 examples/_temp/features 10

 conv5表示提取第五個卷積層的特徵, examples/_temp/feaures表示存放結果的目錄(這裏的目錄需要提前構建好)

4、對已有模型進行find-tuning,比如我們現在有一個1000類的分類模型,但目前我們的需求僅是20類,此時我們不需要重新訓練一個模型,只需要將最後一層換成20類的softmax層,然後使用已有數據對原模型進行fine-tuning即可

  在很多時候,使用Caffe框架學習深度學習模型時,從ImageNet或者其他大型數據集從頭開始訓練獲得一個fine-tuing合適的模型難度太大,這時候最好的情況,就是在已經訓練好的模型上面來進行fine-tuning,通過這些過程可以加深自己對深度學習,以及對caffe使用的瞭解和熟悉,以方便自己在後續提出自己的模型,自己進行模型訓練和fine-tuning的過程。

已經訓練好的caffe模型可以在git的caffe項目中下載,比較經典的模型有:AlexNet.caffemodel , LeNet.caffemodel , RCnn.caffemodel,其他的大家可以在caffe的git官網上面下載。

使用自己的數據集對已經訓練好的模型進行fine-tuning的操作(使用cmdcaffe接口來進行):

 ./build/tools/caffe train -solver models/finetune_flickr_style/solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel -gpu 0
[option] 2>&1 | tee log.txt

第一個參數:選擇好caffe模塊

train:選取train函數

後面接具體的參數,分別爲配置命令,配置文件路徑,fine-tuning命令,fine-tuning依賴的基準模型文件目錄,選用的訓練方式:gpu或者cpu,使用cpu時可以默認不寫

 

注:fine-tuning的過程與訓練過程類似,只是在調用caffe接口時的命令不同,因此在fine-tuning之前,仍然需要按照訓練流程準備數據。

下載數據->生成trainset和testset->生成db->設置好路徑->fine-tuning。

 

5、還有一個是python下面的接口,draw_net.py可以根據.prototxt文件將模式用圖示的方法表示出來,博文開始的模型圖即用該接口所繪

./python/draw_net.py ./examples/siamese/mnist_siamese.prototxt   ./examples/siamese/mnist_siamese.png

使用該接口進行網絡的繪製示例化

 第一個參數爲模型文件,第二個參數爲所繪模型圖的保存地址

 

深度學習中batch_size的作用:

在深度學習訓練過程中,有兩種訓練方法,一種意識batch ,一種是stochastic訓練方法

 

solver:使用forward和backward接口來更新參數,並迭代對loss進行降低(定義的優化方法,有stochastic gradient descent,SGD;Adaptive gradient ,NAG和Scaffolding)

solver作用:(指定優化方法)

1.可以逐步對網絡尋優,創建訓練得到的網絡,並對測試網絡進行評價;

2.通過調用forward和backward來對網絡參數進行迭代尋優;

3.週期性更新網絡;

4.記錄網絡訓練中間過程,尋優過程中記錄狀態

Caffe網絡模型文件分析:

一個完整的基於caffe的網絡模型,應該包含以下幾個文件:

 

其中,deploy.prototxt是用來在網絡完成訓練之後進行部署的(其他深度學習框架導入caffemodel文件時,也是以此爲原型),solver.prototxt用於設定網絡訓練時的參數,train_val.prototxt用於對網絡進行訓練的模型定義,*.caffemodel是預訓練好的網絡模型,存儲網絡中的參數。

 

caffe和theano以及lasagne轉化過程中的一些基礎知識:

在caffe結構中,在convLayer層中有group這樣一個參數,該參數來自於經典的ImageNet論文,關於group參數,yangqing給的解釋爲:

It was there to implement the grouped convolution in Alex Krizhevsky's paper: when group=2, the first half of the filters are only connected to the first half of the input channels, and the second half only connected to the second half.

即當group=2時,filter的前半部分同輸入連接,後半部分同後半部分的filter連接,而在lasagne中並沒有對應的該參數,因此需要使用官方給定的函數接口來進行實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章