(薛開宇學習筆記(三))用自己的資料訓練和測試“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檔案,最後將兩者混合再一起。如圖(train、test、val都是在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、計算影象均值
資料集減去均值影象有利於提高分類的準確性
注意:要保證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團隊的模型)模型直接拿來,將其已將更新好的權重引數作為自己的初始化引數,接著用別人的網路模型結合自己的資料集進行訓練。所以要對模型定義的最後一層進行修改。