Caffe學習筆記1:linux下建立自己的資料庫訓練和測試caffe中已有網路
本文是基於薛開宇 《學習筆記3:基於自己的資料訓練和測試“caffeNet”》基礎上,從頭到尾把實驗跑了一遍~對該文中不清楚的地方做了更正和說明。
主要工作如下:
1、下載圖片建立資料庫
2、將圖片轉化為256*256的lmdb格式
3、計算影象均值
4、定義網路修改部分引數
1、下載圖片建立資料庫
在caffe-master/data 下新建一個屬於自己的資料庫命名為babyjia,並在該資料夾下建立 train 和 val 資料夾用於存放訓練集和驗證集的圖片:
我一共選取了100張訓練集圖片和20張驗證集圖片,分類如下:
訓練集:貓 50 張圖片 狗 50 張圖片
驗證集:貓 10 張圖片 狗 10 張圖片
由於訓練集的圖片較多,我在 train 資料夾下又增加了 dog 和 cat 資料夾
下圖為訓練集中狗類別的示例:
find -name *.jpeg |cut -d '/' -f 3-4>train.txt
find -name *.jpeg |cut -d '/' -f 3-4>val.txt
這個語句的意思是找到當前資料夾下所有
.jpeg
的檔案 並且按照 ‘/’ 去將他們分為一段一段的,3-4的意思是取 第三段和第四段並存儲到train.txt中(3-4的數字的選取根據個人儲存文件的不同而改變)最終保證在 train.txt、val.txt 中儲存的是分別是 train 資料夾和 val 資料夾中的圖片的相對路徑。
train.txt 中的內容:
val.txt 中的內容:
然後把給兩個資料夾中的圖片手動儲存上標籤,0~999均可 ,這裡我們用1代指cat ,2代指dog
同時我們建立 test.txt 檔案,令其內容和 val.txt 一樣,但是所有標籤均為0;
最後我們會在 caffe-master/data/babyjia 資料夾下得到 test.txt train.txt 內容分別如下(val沒有列出來):
2、將圖片轉化為256*256的lmdb格式
在 caffe-master
下的 create_imagenet.sh 拷貝到剛剛建立的 babyjia 檔案下,做相應路徑的修改:
需要修改的地方如下:
DATA=/home/babyjia/caffe-master/data/babyjia
TOOLS=/home/babyjia/caffe-master/build/tools
TRAIN_DATA_ROOT=/home/babyjia/caffe-master/data/babyjia/train/
VAL_DATA_ROOT=/home/babyjia/caffe-master/data/babyjia/val/
.....
RESIZE=false
...
GLOG_logtostderr=1 $TOOLS/convert_imageset\
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$TRAIN_DATA_ROOT \
$DATA/train.txt \
imagenet_train_leveldb 1
echo "Creating val lmdb..."
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$VAL_DATA_ROOT \
$DATA/val.txt \
imagenet_val_leveldb 1
在執行下面的語句後:
./create_imagenet.sh
終端會顯示處理了100個訓練集的圖片和20個驗證集的圖片
同時 caffe-master/babyjia 資料夾中將新增兩個資料夾 imagenet_train_leveldb 與 imagenet_val_leveldb,這就是所生成的leveldb 的檔案3、計算影象均值
把caffe-master/examples/imagenet 資料夾下的make_imagenet_mean.sh檔案拷貝到caffe-master/babyjia檔案下
並做相應的修改
其中
$TOOLS/compute_image_mean.bin//路徑
imagenet_train_leveldb//要求取平均值的leveldb檔案的路徑
$DATA/imagenet_mean.binaryproto //要生成的binaryproto檔案的路徑
執行
./make_imagenet_mean.sh
在指定路徑下出現 binaryproto 檔案4、定義網路修改部分引數
“兩個prototxt檔案和一個sh檔案”
從caffe-master/models/bvlc_reference_caffenet資料夾下拷貝 train_val.prototxt 和solver.prototxt到caffe-master/babyjia資料夾下
從caffe-master/examples/imagenet 資料夾下拷貝 train_caffenet.sh 到caffe-master/babyjia資料夾下
對train_val.prototxt 作如下修改:
transform_param {
mirror: true
crop_size: 227
mean_file: "/home/babyjia/caffe-master/data/babyjia/imagenet_mean.binaryproto"
}
data_param {
source: "/home/babyjia/caffe-master/babyjia/imagenet_train_leveldb"
batch_size: 256
backend: LMDB
}
transform_param {
mirror: false
crop_size: 227
mean_file: "/home/babyjia/caffe-master/data/babyjia/imagenet_mean.binaryproto"
}
data_param {
source: "/home/babyjia/caffe-master/babyjia/imagenet_val_leveldb"
batch_size: 50
backend: LMDB
}
solver.prototxt 作如下修改:
test_iter: 1000 是指測試的批次,我們就 10 張照片,設定 10 就可以了。
test_interval: 1000 是指每 1000 次迭代測試一次,我們改成 500 次測試一次。
base_lr: 0.01 是基礎學習率,因為資料量小, 0.01 就會下降太快了,因此改成 0.001
lr_policy: "step"學習率變化
gamma: 0.1 學習率變化的比率
stepsize: 100000 每 100000 次迭代減少學習率
display: 20 每 20 層顯示一次
max_iter: 450000 最大迭代次數,
momentum: 0.9 學習的引數,不用變
weight_decay: 0.0005 學習的引數,不用變
snapshot: 10000 每迭代 10000 次顯示狀態,這裡改為 2000 次
solver_mode: CPU 末尾加一行,代表用 CPU 進行
(這段直接參考薛開宇的學習筆記粘上來的~)train_caffenet.sh 作如下修改:
最後執行結果如下 :
參考資料:
http://www.cnblogs.com/NanShan2016/p/5532589.html