mnist是一個大型的手寫體數字數據庫,廣泛應用於機器學習領域的訓練和測試。mnist對每張圖都已經進行尺寸歸一化,固定尺寸28像素x28像素。
下面開始手寫體的簡單例子測試caffe的安裝情況。(注:未編譯安裝caffe請移步到我的博客:Ubuntu14.04下深度學習平臺caffe的安裝 文章)
1.下載mnist數據集
mnist部分數據集可以在caffe根目錄下data/mnist下用get_mnist.sh腳本下載。
$ cd data/mnist
$ ./get_mnist.sh
下載好後可以看到4個數據文件。
2.轉換格式
下載到的原始數據集未二進制文件,文件格式可到mnist網站進行查詢。caffe需要識別LEVELDB或LMDB,我們只需要在caffe根目錄下執行
$ ./examples/mnist/create_mnist.sh
瀏覽examples/mnist目錄,發現生產了examples/mnist/mnist_train_lmdb/和examples/mnist/mnist_test_lmdb/兩個目錄, 每個目錄下都有兩個兩個文件:data.mdb和lock.mdb
mnist_train_lmdb是訓練集,mnist_test_lmdb是測試集。
讓我們查看腳本的實現:
#!/usr/bin/env sh
# This script converts the mnist data into lmdb/leveldb format,
# depending on the value assigned to $BACKEND.
set -e
EXAMPLE=examples/mnist
DATA=data/mnist
BUILD=build/examples/mnist
BACKEND="lmdb"
echo "Creating ${BACKEND}..."
rm -rf $EXAMPLE/mnist_train_${BACKEND}
rm -rf $EXAMPLE/mnist_test_${BACKEND}
$BUILD/convert_mnist_data.bin $DATA/train-images-idx3-ubyte $DATA/train-labels-idx1-ubyte $EXAMPLE/mnist_train_${BACKEND} --backend=${BACKEND}
$BUILD/convert_mnist_data.bin $DATA/t10k-images-idx3-ubyte $DATA/t10k-labels-idx1-ubyte $EXAMPLE/mnist_test_${BACKEND} --backend=${BACKEND}
echo "Done."
上面腳本調用了bin/convert_mnist_data.bin這個可執行程序,對應源文件爲examples/mnist/convert_mnist_data.cpp,有興趣可自行查閱其實現。
3.訓練超參數
使用經典的LeNet-5模型進行訓練,模型的描述文件爲examples/mnist/lenet_train_val.prototext。
運行example/mnist/train_lenet.sh腳本。先用vi打開改腳本,內容如下
#!/usr/bin/env sh
set -e
./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt
可見,調用了我們編譯好的build/tools/caffe可執行文件,參數–solver=examples/mnist/lenet_solver.prototxt指定了訓練超參數(Hyper-Parameter)文件。
我們打開examples/mnist/lenet_solver.prototxt文件,其中
net: "examples/mnist/lenet_train_test.prototext"
一行定義了訓練網絡的描述文件。最後一行
solver_mode: CPU
指定了訓練使用的模式,如果已經配置好CUDA,可以改爲GPU。運行此腳本,等待訓練完畢。(使用GPU模式在本人機器GT740M+i5 3230M上耗時5分鐘,使用CPU模式大概爲15-20分鐘)
從圖中可以看出,最後的訓練分類準確率爲99.08%,最終訓練的模型權值保存早examples/mnist/lenet_iter_10000.caffemodel文件中訓練狀態則保存在examples/mnist/lenet_iter_10000.solverstate文件中。這兩個文件都是ProtoBuffer二進制格式文件。
4.預測
利用訓練好的模型權值文件examples/mnist/lenet_iter_10000.caffemodel可以對測試數據集進行預測。運行如下命令
$ ./build/tools/caffe test -model examples/mnist/lenet_train_test.prototext -weights examples/mnist/lenet_iter_10000.caffemodel -itearations 100
命令的參數解釋:
- ./build/tools/caffe test 表示只做預測(前向傳播計算),不進行參數更新(反向傳播計算)
- -model examples/mnist/lenet_train_test.prototext 指定模型描述文本文件
- -weights examples/mnist/lenet_iter_10000.caffemodel 指定預先訓練好的權值文件
- -itearations 100 指定迭代次數
執行命令後如圖所示,得到預測結果。