基於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的配置檔案就可以了,其它都是一樣的操作。