1. 程式人生 > >Caffe學習筆記1:linux下建立自己的資料庫訓練和測試caffe中已有網路

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

下又建立了一個 babyjia 資料夾(上次是在 caffe-master/data 下建立的)這裡將 caffe-master/examples/imagenet 

下的 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