Caffe学习系列(23):如何将别人训练好的model用到自己的数据上
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
打開瀏覽器,運行digits,如果沒有這個工具的,推薦安裝,真的是學習caffe的神器。安裝及使用可參見我的前兩篇文章:Caffe學習系列(21):caffe圖形化操作工具digits的安裝與運行
新建一個classification dataset,設置如下圖:
下面圖片格式選為jpg, 為dataset取一個名字,就開始轉換吧。結果如圖:
三、設置model
回到digits根目錄,新建一個classification model, 選中你的dataset, 開始設置最重要的network.
?
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: truecrop_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: falsecrop_size: 227} }和上面一樣,也是刪除那些項。
3、修改最后一個全連接層(fc8):
layer {name: "fc8-re" #原來為"fc8"type: "InnerProduct"bottom: "fc7"top: "fc8"param {lr_mult: 1.0decay_mult: 1.0}param {lr_mult: 2.0decay_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用到我們自己的圖片分類上,整個微調過程就是這樣了。如果你不用digits,而直接用命令操作,那就更簡單,只需要修改一個train_val.prototxt的配置文件就可以了,其它都是一樣的操作。
總結
以上是生活随笔為你收集整理的Caffe学习系列(23):如何将别人训练好的model用到自己的数据上的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Caffe学习系列(22):caffe图
- 下一篇: 深度学习与计算机视觉系列(10)_细说卷