1. 程式人生 > >基於caffe在已有模型上進行微調finetune

基於caffe在已有模型上進行微調finetune

近期要對醫學影象在caffe上進行微調,總算找到一篇不錯的文章,轉載過來,方便查閱。

網址:http://www.cnblogs.com/denny402/p/5137534.html

caffe團隊用imagenet圖片進行訓練,迭代30多萬次,訓練出來一個model。這個model將圖片分為1000類,應該是目前為止最好的圖片分類model了。

假設我現在有一些自己的圖片想進行分類,但樣本量太小,可能只有幾百張,而一般深度學習都要求樣本量在1萬以上,因此訓練出來的model精度太低,根本用不上,那怎麼辦呢?

那就用caffe團隊提供給我們的model吧。

因為訓練好的model裡面存放的就是一些引數,因此我們實際上就是把別人預先訓練好的引數,拿來作為我們的初始化引數,而不需要再去隨機初始化了。圖片的整個訓練過程,說白了就是將初始化引數不斷更新到最優的引數的一個過程,既然這個過程別人已經幫我們做了,而且比我們做得更好,那為什麼不用他們的成果呢?

使用別人訓練好的引數,必須有一個前提,那就是必須和別人用同一個network,因為引數是根據network而來的。當然,最後一層,我們是可以修改的,因為我們的資料可能並沒有1000類,而只有幾類。我們把最後一層的輸出類別改一下,然後把層的名稱改一下就可以了。最後用別人的引數、修改後的network和我們自己的資料,再進行訓練,使得引數適應我們的資料,這樣一個過程,通常稱之為微調(fine tuning).

既然前兩篇文章我們已經講過使用digits來進行訓練和視覺化,這樣一個神器怎麼能不使用呢?因此本文以此工具為例,講解整個微調訓練過程。

一、下載model引數

可以直接在瀏覽器裡輸入地址下載,也可以執行指令碼檔案下載。下載地址為:http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel

檔名稱為:bvlc_reference_caffenet.caffemodel,檔案大小為230M左右,為了程式碼的統一,將這個caffemodel檔案

下載到caffe根目錄下的 models/bvlc_reference_caffenet/ 資料夾下面。也可以執行指令碼檔案進行下載:

# sudo ./scripts/download_model_binary.py models/bvlc_reference_caffenet


二、準備資料
如果有自己的資料最好,如果沒有,可以下載我的練習資料:http://pan.baidu.com/s/1MotUe

這些資料共有500張圖片,分為大巴車、恐龍、大象、鮮花和馬五個類,每個類100張。編號分別以3,4,5,6,7開頭,各為一類。我從其中每類選出20張作為測試,其餘80張作為訓練。因此最終訓練圖片400張(放在train資料夾內,每個類一個子資料夾),測試圖片100張(放在test資料夾內,每個類一個子資料夾)。

將圖片下載下來後解壓,放在一個資料夾內。比如我在當前使用者根目錄下建立了一個data資料夾,專門用來存放資料,因此我的訓練圖片路徑為:/home/xxx/data/re/train

三、設定model

caffenet的網路配置檔案,放在 caffe/models/bvlc_reference_caffenet/ 這個資料夾裡面,名字叫train_val.prototxt。

開啟這個檔案,將裡面的內容複製到上圖的Custom Network文字框裡,然後進行修改,主要修改這幾個地方:

1、修改train階段的data層為:

複製程式碼
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    crop_size: 227
  }
}
複製程式碼

即把均值檔案(mean_file)、資料來源檔案(source)、批次大小(batch_size)和資料來源格式(backend)這四項都刪

除了。因為這四項系統會根據dataset和頁面左邊“solver options"的設定自動生成。



2、修改test階段的data層:

複製程式碼
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mirror: false
    crop_size: 227
  }
}
複製程式碼

和上面一樣,也是刪除那些項。

3、修改最後一個全連線層(fc8):

複製程式碼
layer {
  name: "fc8-re"               #原來為"fc8"
  type: "InnerProduct"
  bottom: "fc7"
  top: "fc8"
  param {
    lr_mult: 1.0
    decay_mult: 1.0
  }
  param {
    lr_mult: 2.0
    decay_mult: 0.0
  }
  inner_product_param {
    num_output: 5        #原來為"1000"
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0.0
    }
  }
}
複製程式碼

看註釋的地方,就只有兩個地方修改,其它不變。

設定好後,就可以開始微調了(fine tuning).

訓練結果就是一個新的model,可以用來單張圖片和多張圖片測試。具體測試方法前一篇文章已講過,在此就不重複

了。

在此,將別人訓練好的model用到我們自己的圖片分類上,整個微調過程就是這樣了。只需要修改一個

train_val.prototxt的配置檔案就可以了,其它都是一樣的操作。