1. 程式人生 > >(薛開宇學習筆記(三))用自己的資料訓練和測試“CaffeNet”

(薛開宇學習筆記(三))用自己的資料訓練和測試“CaffeNet”

1.資料準備

原文是用ImageNet1000類的資料庫,本文是自己模仿一個小的資料庫進行下去的,在caffe下新建一個myself資料夾,並在網上下載了訓練貓的圖片60張,測試貓10張,訓練狗的圖片60張,測試狗10張,如圖:

為了方便,對下載的圖片名進行修改,修改程式碼如下:

import os;
def rename():
    count=0;
    name="dog";
    path='/home/****/caffe/data/myself/train/dog';#your caffe 
    filelist=os.listdir(path)
    for files in filelist:
        olddir=os.path.join(path,files);
        if os.path.isdir(olddir):
            continue;
        filename=os.path.splitext(files)[0];
        filetype=os.path.splitext(files)[1];
        newdir=os.path.join(path,name+str(count)+filetype);
        os.rename(olddir, newdir);
        count+=1;
rename();

2.資料處理,生成文字train.txt,val.txt

A、利用指令(開啟終端cd caffe路徑下):

find train/dog -name *.jpg |cut -d '/' -f2-3 >train.txt
 	  sed "s/$/ 2/" ./train.txt>./train1.txt

生成了狗的txt檔案,並在名稱後加了標籤2,隨後再用同樣的方法生成貓的txt檔案,最後將兩者混合再一起。如圖(traintestval都是在myself資料夾下的

用同樣的指令生成val.txt,test.txt,test.txt是複製val.txt的,只是所有名稱後的標籤都是0。(注意不要將標籤弄錯)

B、接著是將圖片歸一統一大小(256*256),直接再終端利用指令:

for name in train/dog/*.jpg ; do  convert -resize 256x256\! $name $name; done

C、將圖片資料轉換為lmdb/leveldb

直接利用examples/imagenet/create_imagenet.sh進行生成:將指令碼複製到新建的myself資料夾中,改名為creat_myimagenet.sh,並將裡面的路勁修改成自己的路徑,如圖:

生成的lmdb名稱改為了:

D、計算影象均值

       資料集減去均值影象有利於提高分類的準確性

,直接用build/tools/compute_image_mean.cpp實現,它是通過指令碼./make_iamgenet_mean執行的,同樣的在imagenet下將make_imagenet_mean.sh複製到新建myself下,改名為make_myimagenet_mean.sh,同樣的也要修改裡面的路徑。

注意:要保證lmdb的名稱對應的是自己生成的,

           最終生成了二進位制均值檔案myimagenet_mean.binaryproto

3.網路的定義

這裡直接利用caffe中定義好的模型,將models/bvlc_reference_caffenet/solver.prototxt train_val.prototxt兩個檔案複製到新建myself夾下,進行修改:

           其中solver.prototxt檔案:(可以將max_iter調小點後面的那個圖,500)

網路定義檔案train_val.prototxt:(修改四處路徑

4.訓練模型

在examples/imagenet/train_caffenet.sh 複製到myself中,並修改路徑:

           隨後直接執行train_caffenet.sh(一共迭代4000次),要保證loss的收斂,若loss狂增,要將基礎學習率調整的較低,這裡再solver.prototxt中調為0.001。模型訓練未採取GPU,故訓練了一晚上。最終結果如下:

(4000次)

(500次)

         分析:4000次的loss還是比較大的,準確率在60%左右,並不理想,這與選擇的資料集是有關係的。同時發現本文利用的是caffenet模型結構,那麼這個結構的最後一層的神經元是有1000個,用於1000分類的,而本實驗只有兩個分類,這需要對模型的最後一層進行微調才行,所謂的微調:就是將原本別人的(caffe團隊的模型)模型直接拿來,將其已將更新好的權重引數作為自己的初始化引數,接著用別人的網路模型結合自己的資料集進行訓練。所以要對模型定義的最後一層進行修改。