Caffe入門與實踐-簡介
目錄:
- 一,整體結構
- 二,介面
- 三,使用流程
- 四,實戰案例
一,整體結構
神經網路一般包括:訓練,測試兩大階段。
按照 李沐 的說法,訓練: 就是把訓練數據(原料)和 神經網路模型:如AlexNet(丹方) 「倒進」 神經網路訓練框架例如cafffe,Mxnet(煉丹爐)然後用 CPU或GPU(真火) 「提煉出」 模型參數(仙丹)的過程。測試: 就是把 測試數據 用 訓練好的模型(神經網路模型 + 模型參數)跑一跑 看看結果如何。
作為煉丹爐之一的caffe,就是把煉製過程所涉及的概念做抽象,形成一套體系。總的來講,由低到高依次把 網路中的數據抽象成Blob, 各層網路抽象成 Layer ,整個網路抽象成Net,網路模型的求解方法 抽象成 Solver。
- Blob 主要用來表示網路中的數據,包括訓練數據,網路各層自身的參數,網路之間傳遞的數據都是通過 Blob 來實現的,同時 Blob 數據也支持在 CPU 與 GPU 上存儲,能夠在兩者之間做同步。
- Layer 是對神經網路中各種層的一個抽象,包括我們熟知的卷積層和下採樣層,還有全連接層和各種激活函數層等等。同時每種 Layer 都實現了前向傳播和反向傳播,並通過 Blob 來傳遞數據。
- Net 是對整個網路的表示,由各種 Layer 前後連接組合而成,也是我們所構建的網路模型。
- Solver 定義了針對 Net 網路模型的求解方法,記錄網路的訓練過程,保存網路模型參數,中斷並恢復網路的訓練過程。自定義 Solver 能夠實現不同的網路求解方式。
上段內容來自:http://blog.luoyetx.com/2015/10/reading-caffe-1/
二,介面
一個系統必須提供方便人類使用的人機交互的介面。而當前可選介面無非是那麼幾種: 命令行,配置文件,GUI,編程語言API,web API(例如RESTful) 等等。Caffe提供了三大介面。 命令行(cmdcaffe ),python API(pycaffe),matlab API (matcaffe)。
命令行(Command Line):
命令行簡單高效,配合一下配置文件就可以向機器完美表達人類的意圖。
訓練: solver.prototxt 是網路求解文件,由它定義 一些網路訓練參數和網路結構文件路徑等。
# 訓練示例 (參數: 求解文件)ncaffe train -solver examples/mnist/lenet_solver.prototxtnn# 從訓練一半的模型快照中恢復訓練 (參數:求解文件 快照)ncaffe train -solver examples/mnist/lenet_solver.prototxt -snapshot examples/mnist/lenet_iter_5000.solverstann# 由其它訓練好的模型 fine-tune (參數:求解文件 其它訓練好的模型參數) ncaffe train -solver examples/finetuning_on_flickr_style/solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodeln
測試:
# score the learned LeNet model on the validation set as defined in then# model architeture lenet_train_test.prototxtn# 測試 (參數: 求解文件 訓練好的模型參數 )ncaffe test -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -gpu 0 -iterations 100n
注意:網路結構必須定義輸出精度或者輸出損失作為結果。
Python:
- caffe.SGDSolver exposes the solving interface.
- http://caffe.io handles input / output with preprocessing and protocol buffers.
- caffe.draw visualizes network architectures.
- Caffe blobs are exposed as numpy ndarrays for ease-of-use and efficiency.
舉例:
caffe.set_mode_cpu() #設置cpu模式nncaffe.set_device(0) #設置GPU模式ncaffe.set_mode_gpu()nnnet = caffe.Net(conv.prototxt, caffe.TEST) #載入網路nnnet.blobs #for input data and its propagation in the layers nnnet.params #a vector of blobs for weight and bias parametersnnnet.forward() #前向傳播nnnet.save(mymodel.caffemodel) #保存模型參數n
具體請參考官網:http://caffe.berkeleyvision.org/tutorial/interfaces.html
MATLAB:
具體請參考官網:http://caffe.berkeleyvision.org/tutorial/interfaces.html
三,使用流程
1、數據格式處理,把原始圖片處理成caffe支持的如下格式之一:
- 資料庫格式 (LEVELDB or LMDB) $CAFFEROOT/build/tools/convert_imageset 可以用來做把原始圖片轉換為LevelDB或者 Lmdb格式。
- 內存數據
- HDF5數據
- 圖像數據
Windows
Dummy
參考:http://caffe.berkeleyvision.org/tutorial/layers.html#data-layers
2. 編寫網路結構文件 ( .prototxt) 作用就是定義網路結構: 例如 caffe/examples/mnist/lenet_train_test.prototxt 定義了下圖的結構:# 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.01momentum: 0.9weight_decay: 0.0005# The learning rate policylr_policy: "inv"gamma: 0.0001power: 0.75# Display every 100 iterations
display: 100# The maximum number of iterationsmax_iter: 10000# snapshot intermediate resultssnapshot: 5000snapshot_prefix: "examples/mnist/lenet"# solver mode: CPU or GPUsolver_mode: CPU其中訓練網路和測試網路的定義有兩種方式:方式一: 在solver.prototxt 文件中分別定義訓練網路和測試網路
train_net: "examples/hdf5_classification/nonlinear_auto_train.prototxt"ntest_net: "examples/hdf5_classification/nonlinear_auto_test.prototxt"n
方式二: 在solver.prototxt 文件只定義一個網路結構
net: "examples/mnist/lenet_train_test.prototxt"n
但是在改網路結構中 通過 include phase 判斷該層是在測試時載入,還是訓練時載入。
layer {n name: "data"n type: "Data"n top: "data"n top: "label"n include {n phase: TRAINn }n data_param {n source: "examples/imagenet/ilsvrc12_train_lmdb"n batch_size: 256n backend: LMDBn }n}nlayer {n name: "data"n type: "Data"n top: "data"n top: "label"n top: "label"n include {n phase: TESTn }n data_param {n source: "examples/imagenet/ilsvrc12_val_lmdb"n batch_size: 50n backend: LMDBn }n}n
# 訓練示例 (參數: 求解文件)ncaffe train -solver examples/mnist/lenet_solver.prototxtnn# 從訓練一半的模型快照中恢復訓練 (參數:求解文件 快照)ncaffe train -solver examples/mnist/lenet_solver.prototxt -snapshot examples/mnist/lenet_iter_5000.solverstann# 由其它訓練好的模型 fine-tune (參數:求解文件 其它訓練好的模型參數) ncaffe train -solver examples/finetuning_on_flickr_style/solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodeln
基於Python和Matlab的訓練請看官網。
5.測試
基於命令行測試:
# score the learned LeNet model on the validation set as defined in then# model architeture lenet_train_test.prototxtn# 測試 (參數: 求解文件 訓練好的模型參數 )ncaffe test -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -gpu 0 -iterations 100n
網路結構必須定義輸出精度或者輸出損失作為結果。
基於python和Matlab的測試請看官網和後續實戰案例。三,實戰案例
接下來準備寫幾篇手寫數字識別的案例。
案例一: caffe官網Lenet實戰,基於命令行介面(cmdcaffe)的訓練 和 測試詳解
案例二: 用訓練好的Lenet模型,基於python介面 預測手寫數字
案例三: 用訓練號的Lenet模型,基於python介面 完成 kaggle 的數字識別挑戰
推薦閱讀:
※1.7 重談多層神經網路與BP演算法實現
※關於神經網路輸入標準化
※用Python實現BP神經網路(附代碼)
※什麼是 DQN (強化學習)
※Learn R | 機器學習中的人工神經網路(四)
TAG:神经网络 |