在經過前面Caffe框架的搭建以及caffe基本框架的了解之后,接下來就要回到正題:使用caffe來進行模型的訓練。
但如果對caffe並不是特別熟悉的話,從頭開始訓練一個模型會花費很多時間和精力,需要對整個caffe框架有一個很清楚的了解,難度比較高;同時,在使用數據迭代訓練自己模型時會耗費很多計算資源。對於單GPU或者沒有大的GPU計算能力的研究者會比較困難。所以,使用已經訓練好的caffe模型來進行finetuning就會是一個比較好的選擇。
一來,finetuning的過程和訓練的過程步驟大體相同,因此在finetuning的過程中可以對caffe訓練過程有一個詳細的了解,通過一步步的訓練和finetuning,在尋找最優參數過程中加深對caffe框架的理解,為自己后續自己從頭開始訓練一個caffe深度網絡模型打好基礎。
另外,finetuning需要的計算資源相對較少,使用的trikes相對較少,難度較低,比較適合caffe新手。在finetuning過程中熟悉caffe的各種接口和操作。
話不多少,進入正題:使用caffe進行finetuing
在finetuning之前,我們應該了解到caffe是一個深度學習框架,在建立好神經網絡模型之后,使用大量的數據進行迭代調參數獲取到一個深度學習模型,我們使用這樣的模型來實現我們的任務,如:圖像分類,目標檢測等。
在caffe中,訓練好的模型為*.caffemodel,在github上面下載的caffe源代碼中並沒有caffemodel,需要我們單獨去下載,下載地址同樣也在caffe在git的官網上(經典Alex模型下載點這里),在git上面還有其它已經訓練好的模型文件,如GooLenet,Rcnn模型等等。
在下載好model文件之后,按照下面的步驟進行模型的finetuning。
1. 下載數據,轉換數據( Convert data)
2. 定義網絡結構(Define net (as prototxt) )
3. 設置網絡訓練過程中的各種參數(Define solver (as prototxt) )
4. 開始訓練(Train (with pretrained weights))
1.下載數據按照要求准備好數據,這里主要講一下如何將數據轉換寫入db文件中,方便網絡訓練過程中對數據的讀寫要求。
使用tools/convert_imageset.cpp將獲取到的數據和標簽寫入db文件中。
需要注意的是,對於每一個訓練樣本,文件的格式應該是:
“[path/to/image.jpeg] [label]”
2.設計定義網絡結構
● 如果是訓練過程,那么需要重新寫一個*.prototxt 文件,文件格式可以參考src/caffe/proto/caffe.proto下的定義。最簡單的方法就是復制一個example中的proto文件根據自己的需要進行修改
● 如果需要對網絡進行finetuning,那么復制一份該model文件對應的prototxt文件進行修改,因為finetuning的過程是讓原有訓練好的模型適應自己的數據,因此一般情況下,網絡的模型並沒有大的變化。需要做的事情有:
○ 修改文件中的數據層(因為是進行finetuning,因此數據輸入層是自己的數據)
○ 修改輸出層,因為一般情況下,finetuning的應用與原模型的應用不完全相同。
如:imagenet中的分類輸出為1000類,所以在最終輸出層時會是一個1000的向量,但是在實際應用中,類別可能只有10+種,因此不能直接使用imagenet中的輸出層,需要對輸出層進行修改;
○ 如果GPU比較小,計算能力比較差的話,需要減小batch_size參數,提高迭代效率;
○ **將blobs_lr參數設置為0**, 因為在finetuning過程中,網絡的答題框架參數是不變的,我們只需要使用自己的數據對網絡的小部分結構中參數進行更新和學習,因此需要將blob_lr參數設置為0,將網絡的層參數進行凍結,不進行更新。
3.定義網絡參數(proto文件)
在對caffe熟悉過程中,了解到在使用caffe進行網絡訓練時,需要在*.proto文件中設定網絡訓練所需參數信息。需要修改的地方有:
○ 將網絡改成自己的網絡
○ 修改snapshot的前綴snapshot_prefix(用於存儲訓練過程中的中間結果)
○ 減小基礎學習率(base learning rate,divide by 100)
○ 修改參數max_iter 和 snapshot