1. 程式人生 > >使用pycaffe進行的fine-tuning的過程

使用pycaffe進行的fine-tuning的過程

最近在進行caffe的fine-tuning的實驗,在此做個簡單地介紹和總結,方便以後的查詢。

pre-trainning 與 fine-tuning 簡單介紹

在使用大型網路的時候,經常是自己的資料集有限,為此常常會使用現已成熟的網路結構,如:alexnet,Googlenet,vggnet等,可以使用之前在開源社群中已經有人訓練好的引數檔案(.caffemodel),進行網路的初始化,然後使用自己的資料集進行引數的fine-tuning的過程。pre-trainning 在此,可以看作是caffemodel的引數資料(別人已經訓練好或者是自己訓練的網路的引數)。只是將原始的隨機初始化,變成了已經有一定的使用的成熟的網路引數而已。

fine-tuning 的過程

本文就以vggnet-19 為例 進行介紹

引數與網路的結構使用的是

https://gist.github.com/ksimonyan/3785162f95cd2d5fee77#file-readme-md

1. 獲取已有網路的結構(prototxt)和網路引數(caffemodel)

2. 準備好所要替換的自己的資料集,可以仿照原有的網路打包成lmdb或者其他格式的資料,也可以是原始的影象資料,這裡不再進行說明,可以參考以前的博文。

3. mean file的計算,這裡的話,我是將此檔案替換成了自己資料集的mean file(train的集的),但是實驗室的另一個大神他說這個是可以不進行替換的,只是一個normal的檔案影響不是很大。(此步可以跳過)

4. 根據的自己的需要將最後的全連線的層,以及自己所需要改的層進行名字的修改,不要和原有的層的名稱相同即可,caffe網路結構的引數讀取,是根據名字將相應的引數讀入到網路中的,修改之後,就不會將引數讀入到網路中,這些引數就是隨機產生的。但是常使用的就是修改最後的全連線層,我這裡主要是分類的類別需要修改,例如10分類,改成100分類等。

5.最後是使用caffe的工具將fine-tuning的網路跑起來進行訓練。

可以參考caffe的官網:

http://caffe.berkeleyvision.org/gathered/examples/finetune_flickr_style.html

./build/tools/caffe train -solver models/finetune_flickr_style/solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel -gpu 0
這裡的可以使用GPU或者是不指定,預設使用的是CPU。

以上就是整個過程。其實不難,只是在使用上如何更好的使用到自己的網路中。

以上的方法也是可以只進行卷積的過程,提取深度卷積的特徵圖,可以將某一層的資料使用python指令碼序列化到硬碟上,以備後面的將特徵圖進行統一格式的處理,放入到其他的分類其上進行分類。(在此有個有趣的東西,就是影象的卷積不需要對影象的尺寸進行限制的,我們可以但用來提取任意大小的影象的特徵,在批量計算時需要對資料的維數進行考慮,感興趣的可以看一下sppnet等,fastercnn等網路,蠻有意思的)。