標籤:

Caffe入門與實踐-簡介

目錄:

  • 一,整體結構

  • 二,介面

  • 三,使用流程

  • 四,實戰案例

===================================================

一,整體結構

神經網路一般包括:訓練測試兩大階段。

按照 李沐 的說法,訓練: 就是把訓練數據(原料)和 神經網路模型:如AlexNet(丹方) 「倒進」 神經網路訓練框架例如cafffe,Mxnet(煉丹爐)然後用 CPU或GPU(真火) 「提煉出」 模型參數(仙丹)的過程。測試: 就是把 測試數據 用 訓練好的模型(神經網路模型 + 模型參數)跑一跑 看看結果如何。

作為煉丹爐之一的caffe,就是把煉製過程所涉及的概念做抽象,形成一套體系。

總的來講,由低到高依次把 網路中的數據抽象成Blob, 各層網路抽象成 Layer ,整個網路抽象成Net,網路模型的求解方法 抽象成 Solver。

  • Blob 主要用來表示網路中的數據,包括訓練數據,網路各層自身的參數,網路之間傳遞的數據都是通過 Blob 來實現的,同時 Blob 數據也支持在 CPU 與 GPU 上存儲,能夠在兩者之間做同步。
  • Layer 是對神經網路中各種層的一個抽象,包括我們熟知的卷積層和下採樣層,還有全連接層和各種激活函數層等等。同時每種 Layer 都實現了前向傳播和反向傳播,並通過 Blob 來傳遞數據。
  • Net 是對整個網路的表示,由各種 Layer 前後連接組合而成,也是我們所構建的網路模型。
  • Solver 定義了針對 Net 網路模型的求解方法,記錄網路的訓練過程,保存網路模型參數,中斷並恢復網路的訓練過程。自定義 Solver 能夠實現不同的網路求解方式。

上段內容來自:blog.luoyetx.com/2015/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.Net is the central interface for loading, configuring, and running models. caffe.Classifierand caffe.Detector provide convenience interfaces for common tasks.
    • caffe.SGDSolver exposes the solving interface.
    • 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

    具體請參考官網:caffe.berkeleyvision.org

    MATLAB

    具體請參考官網:caffe.berkeleyvision.org

    三,使用流程

    1、數據格式處理,把原始圖片處理成caffe支持的如下格式之一:

    • 資料庫格式 (LEVELDB or LMDB) $CAFFEROOT/build/tools/convert_imageset 可以用來做把原始圖片轉換為LevelDB或者 Lmdb格式。
    • 內存數據

    • HDF5數據

    • 圖像數據
    • Windows

    • Dummy

    參考:caffe.berkeleyvision.org

    2. 編寫網路結構文件 ( .prototxt)

    作用就是定義網路結構: 例如 caffe/examples/mnist/lenet_train_test.prototxt 定義了下圖的結構:

    3、網路求解文件 (.prototxt)

    定義了網路模型訓練過程中需要設置的參數,比如學習率,權重衰減係數,迭代次數,使用GPU還是CP等。

    示例: caffe/examples/mnist/lenet_solver.prototxt

    # 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: 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

    4. 訓練

    基於命令行的訓練:

    # 訓練示例 (參數: 求解文件)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:神经网络 |