caffe入门教程
(一)簡介
1.caffe是一個清晰而高效的深度學習框架,純粹的C++/CUDA架構,支持命令行、Python和MATLAB接口,可以在CPU和GPU直接無縫切換;
2.caffe的主要優勢:
(1)CPU與GPU的無縫切換;
(2)模型與優化都是通過配置文件來設置,無需代碼;
3.caffe的下載與安裝:
(1)下載
(2)安裝
(3)caffe的下載與安裝以及一些基本的介紹官網已經描述地比較詳細,這里不再重復;
4.caffe的使用接口有命令行,python跟matlab,個人覺得訓練模型的時候使用命令行已經足夠簡單了,至于訓練好的模型可以使用python與matlab的接口進行調用,本文先描述基于命令行的模型訓練,以LeNet模型為例;
(二)LeNet模型
PS:LeNet是手寫數字庫MNIST上應用比較經典的模型,具有7層網絡結構,分別是卷積-下采樣-卷積-下采樣-全連-全連-分類層,具體網絡細節可以參考文章:
Gradient based learning applied to document recognition
1.安裝編譯完caffe后,其主目錄下有:
2.訓練模型之前需要先準備好訓練數據MNIST,執行以下命令可以下載MNIST數據庫:
3.由于caffe支持的數據類型不包括圖像類型,所以常規做法需要將圖像類型轉為lmdb類型:
4.準備好數據之后,我們需要定義我們的網絡模型,在caffe中是通過.prototxt配置文件來定義的,執行以下命令:
可以看到各個網絡層是如何定義的:
(1)輸入層(數據層):
layer {name: "mnist" //表示層名type: "Data" //表示層的類型top: "data" top: "label"include {phase: TRAIN //表示僅在訓練階段起作用}transform_param {scale: 0.00390625 //將圖像像素值歸一化}data_param {source: "examples/mnist/mnist_train_lmdb" //數據來源batch_size: 64 //訓練時每個迭代的輸入樣本數量backend: LMDB //數據類型} }(2)卷積層: layer {name: "conv1"type: "Convolution"bottom: "data" //輸入是datatop: "conv1" //輸出是卷積特征param {lr_mult: 1 //權重參數w的學習率倍數}param {lr_mult: 2 //偏置參數b的學習率倍數}convolution_param {num_output: 20kernel_size: 5stride: 1weight_filler { //權重參數w的初始化方案,使用xavier算法type: "xavier"}bias_filler {type: "constant" //偏置參數b初始化化為常數,一般為0}} }(3)下采樣層(pool): layer {name: "pool1"type: "Pooling"bottom: "conv1"top: "pool1"pooling_param {pool: MAXkernel_size: 2stride: 2} }
(4)全連層: layer {name: "ip1"type: "InnerProduct"bottom: "pool2"top: "ip1"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 500weight_filler {type: "xavier"}bias_filler {type: "constant"}} }(5)非線性層: layer {name: "relu1"type: "ReLU"bottom: "ip1"top: "ip1" }(6)準確率層(計算準確率): layer {name: "accuracy"type: "Accuracy"bottom: "ip2"bottom: "label"top: "accuracy"include {phase: TEST} }(7)損失估計層: layer {name: "loss"type: "SoftmaxWithLoss"bottom: "ip2"bottom: "label"top: "loss" }
5.定義完網絡模型,還需要配置關于模型優化的文件:
配置文件如下:
# The train/test net protocol buffer definition net: "examples/mnist/lenet_train_test.prototxt" //設定網絡模型配置文件的路徑 # test_iter specifies how many forward passes the test should carry out. # In the case of MNIST, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. test_iter: 100 # Carry out testing every 500 training iterations. test_interval: 500 # The base learning rate, momentum and the weight decay of the network. base_lr: 0.01 momentum: 0.9 weight_decay: 0.0005 # The learning rate policy lr_policy: "inv" gamma: 0.0001 power: 0.75 # Display every 100 iterations display: 100 # The maximum number of iterations max_iter: 10000 # snapshot intermediate results snapshot: 5000 snapshot_prefix: "examples/mnist/lenet" # solver mode: CPU or GPU solver_mode: GPU6.接下來一步就是進行訓練了,直接執行命令就可以:
執行后可以看到:首先會讀取配置文件初始化網絡跟優化器:
緊接著開始優化:
可以看到訓練過程中每100次迭代就會顯示一個loss,每500次迭代就會計算一次test準確率,總共10000次迭代,這些都可以在配置文件中設置;
7.訓練完之后的模型就保存在.caffemodel文件中,該文件可以被c,python,matlab等調用;
8.通過前面博文的LeNet模型的使用,我們可以發現,使用caffe訓練模型只需要以下幾個步驟:
(1)準備好數據;
(2)寫好模型配置文件;
(3)寫好優化配置文件;
(4)命令行執行;
這樣就可以得到訓練的模型.caffemodel文件了;
(三)基于命令行的模型訓練
1.準備數據
(1)數據來源:任意的jpg或其他格式的圖像數據;
(2)劃分數據為train跟val數據集,并且使用文本記錄好對應的標簽(自己寫腳本就可以),格式如下:
注意label是從0開始的;
(3)將數據轉化為lmdb,在caffe的根目錄下,/build/tools/下有各種可以使用的命令行工作,為了將圖像數據轉為lmdb,使用的是convert_imageset指令,具體如下:
$CAFFE_TOOLS/convert_imageset \--resize_height=$RESIZE_HEIGHT \--resize_width=$RESIZE_WIDTH \--shuffle \$IMAGE_DATA_ROOT \$LABEL_DATA_PATH/label.txt \$OUTPUT_PATH/data_lmdb其中CAFFE_TOOLS是命令行路徑;resize_height根據自己需要決定是否要將原始圖片resize;2.訓練模型
前面已經講述了如何配置模型文件跟優化文件,現在需要注意的是如何調用命令行來訓練:
很簡單,只需指定優化配置文件的路徑即可;
至此模型訓練結束,我們已經得到了我們想要的模型,存放在. caffemodel中;
3.使用模型
以下記錄如何用命令行使用訓練好的模型,主要是講述提取每層的特征:
(1)test.prototxt描述的是測試的網絡結構;
(2)ip2表示需要提取特征的層的名字;
4.注意事項
(1)在將jpg數據轉為lmdb時,都需要有label的文本信息,一般來說,train跟validation數據是帶有label的,test數據是沒有的,一般是給test數據提供index文本信息;
(2)在模型訓練過程中將導入train數據跟val數據,其中train數據是為了訓練模型,val數據給出識別率為調參提供參考;其中val數據不是必須的,根據需要在訓練模型配置文件中定義;
(3)訓練過程的模型文件既定義了訓練模型也定義了驗證模型,而提取特征過程的模型文件中只定義測試模型;
(4)在提取的特征中,每張圖象的特征的次序跟輸入的次序是不一樣的,為了得到caffe中模型訓練過程的輸入圖像的次序,可以通過提取test數據的index文本信息,也就是label信息;
(5)提取出來的特征以lmdb形式給出,需要根據需要自行轉換;
總結
- 上一篇: 初步认识spring mvc
- 下一篇: 51nod 1307 绳子与重物 二分