Deep learning model–caffe 使用教學

 

了解 caffe 之前必須先懂得 這四個東西之間的關係

四個物件是一層包一層的

Blob,Layer,Net,Solve

 

Blob:是基礎的數據結構,是用來保存學習到的參數以及網絡傳輸過程中產生數據 的類

Layer:是網絡的基本單元,由此派生出了各種層類。修改這部分的人主要是研究特徵表達方向的。

Net:是網絡的搭建,將 Layer 所派生出層類組合成網絡

Solver:是 Net 的求解, 修改這部分人主要會是研究 DL 求解方向的。

 

通常您有數據 如圖片等資料時

必須把它從 RGB 矩陣模式 轉成Blob 的數據結構

然後再輸進去 layer中做訓練

而很多layer  可以組成 一個網路 例如一個autoencoder

最後我們會寫一個solver 來訓練這網路 告訴它 weight 該怎麼改….bla bla 的~

 

相信大家還是很模糊  那就跟著小編一步一步的操作吧~

以下所講的都是來自官網資訊  :   http://caffe.berkeleyvision.org/

大家有不懂的可以查詢

 

 

首先我們先來學如何創造數據吧

 

1.創造數據庫

移動到caffe 目錄下 執行以下指令

cd $CAFFE_ROOT

執行完後會出現如下圖四個檔案為mnist 壓縮過後的圖檔 以及laybel
./data/mnist/get_mnist.sh

 

再執行已下指令將 image data 轉成 blob 型式

執行完會出現兩個資料夾 分別是訓練資料以及測試資料



./examples/mnist/create_mnist.sh

 

 

2.訓練數據

cd $CAFFE_ROOT

./examples/mnist/train_lenet.sh

跑完產生檔案:     lenet_iter_10000.caffemodel      lenet_iter_10000.solverstate

第一個檔案為caffe 訓練完的model 包含 weight ,bias 等資訊

 

第二個檔案可以為後續訓練之用 假如以後想再訓練到20000 iteration 的話 就可以使用此檔

範例如下:

# resume training from the half-way point snapshot

caffe train -solver examples/mnist/lenet_solver.prototxt -snapshot examples/mnist/lenet_iter_5000.solverstate

 

 

3.測試數據

當所有數據都訓練好之後,接下來就是如何將模型應用到實際數據了:

cd $CAFFE_ROOT

實際上就只是運行caffe.bin 這個檔案 後面只是運行的參數

橘色代表運行模式 綠色輸入要解決的網路 紅色輸入剛剛訓練出來的weight

./build/tools/caffe test -model=examples/mnist/lenet.prototxt -weights=examples/mnist/lenet_iter_10000.caffemodel -gpu=0

如果沒有GPU則使用

./build/tools/caffe test -model=examples/mnist/lenet.prototxt -weights=examples/mnist/lenet_iter_10000.caffemodel

4.調用數據

將train 的 網路改成可以輸出的網路 mnist_autoencoder_half

因為我們不需要訓練網路了 所以需要把和data 相關的 layer 都刪掉

做成一個適合當 deploy 的網路

詳細方法可參考官網:

https://github.com/BVLC/caffe/wiki/Using-a-Trained-Network:-Deploy

或者我自己做的教學

 

 

底下是用python 寫出調用數據的範例:

 

import caffe
import numpy as np

np.set_printoptions(threshold=’nan’)

#將剛剛改好的網路丟入
MODEL_FILE = ‘
mnist_autoencoder_half.prototxt’

#將訓練好的weights 丟入
PRETRAIN_FILE = ‘mnist_autoencoder_iter_65000.caffemodel’

#將上面兩組資料丟入Net
net = caffe.Net(MODEL_FILE, PRETRAIN_FILE, caffe.TEST)
transformer = caffe.io.Transformer({‘data’: net.blobs[‘data’].data.shape})
transformer.set_transpose(‘data’, (2, 0, 1))
transformer.set_raw_scale(‘data’, 255)
net.blobs[‘data’].reshape(1, 1, 28, 28)

#將要測試的圖片丟入 出來的資料為28,28,1三維矩陣
img = caffe.io.load_image(‘cat_28_28.jpg’, color=False)

print “Show the size of image:\n”,img.shape,”\n”

#將矩陣資料轉為Blob 型式
net.blobs[‘data’].data[…] = transformer.preprocess(‘data’, img)

#讓網路執行向前傳遞法 出來的資料型態為blob
out = net.forward()

#底下示範取出資料方法
print “The type of the data come from net is Blob:\n”,out,”\n”
print “We need to convert it to matrix that we can use:\n”,
out[net.outputs[0]],“\n”

#藍色部分可以改為要取出的layer 名稱
print “This is second method that can extract any data from any layer:\n”,
net.blobs[‘encode4neuron‘].data,”\n”

 

5.Code 架構理解:

每個layer 內的大概架構說明

layer {
  name: “conv1” # 名稱:conv1
  type: “Convolution” # 類型:卷積層
  bottom: “data” # 輸入層:數據層
  top: “conv1” # 輸出層:卷積層1
  # 濾波器(filters)的學習速率因子和衰減因子
  param { lr_mult: 1 decay_mult: 1 }
  # 偏置項(biases)的學習速率因子和衰減因子
  param { lr_mult: 2 decay_mult: 0 }
  convolution_param {
    num_output: 96 # 96個濾波器(filters)
    kernel_size: 11 # 每個濾波器(filters)大小為11*11
    stride: 4 # 每次濾波間隔為4個像素
    weight_filler {
      type: “gaussian” # 初始化高斯濾波器(Gaussian)
      std: 0.01 # 標準差為0.01, 均值默認為0
    }
    bias_filler {
      type: “constant” # 初始化偏置項(bias)為零
      value: 0
    }
  }
}

 

 

分析上面的訓練步驟 共有三個檔案:

一個為:lenet.prototxt    

描述網路結構

 

一個為:lenet_solver.prototxt          

描述用何方法求解上述網路結構 檔案內必須包含 lenet_train_test.prototxt

 

一個為:train_lenet.sh                      

調用caffe 訓練網路   檔案內必須包含 lenet_solver.prototxt

 

仔細分析完之後是一個檔案包一個, 先寫網路檔出來

然後再寫網路檔的solver

最後再調用caffe 其實我覺得不用最後一個檔案也可以

因為裡面就只有一句話

./build/tools/caffe train –solver=examples/mnist/lenet_solver.prototxt

就是調用caffe 做訓練模式阿@@  炯

 

 

 

底下列出三個檔案的內容:

1.lenet.prototxt 檔

name: “LeNet”

******************************************************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: “mnist”

 type: “Data”

 top: “data”

 top: “label”

 include {

   phase: TEST

 }

 transform_param {

   scale: 0.00390625

 }

 data_param {

   source: “examples/mnist/mnist_test_lmdb”

   batch_size: 100

   backend: LMDB

 }

}

*********************************************************3

layer {

 name: “conv1”

 type: “Convolution”

 bottom: “data”

 top: “conv1”

 param {

   lr_mult: 1

 }

 param {

   lr_mult: 2

 }

 convolution_param {

   num_output: 20

   kernel_size: 5

   stride: 1

   weight_filler {

     type: “xavier”

   }

   bias_filler {

     type: “constant”

   }

 }

}

**********************************************************4

layer {

 name: “pool1”

 type: “Pooling”

 bottom: “conv1”

 top: “pool1”

 pooling_param {

   pool: MAX

   kernel_size: 2

   stride: 2

 }

}

**********************************************************5

layer {

 name: “conv2”

 type: “Convolution”

 bottom: “pool1”

 top: “conv2”

 param {

   lr_mult: 1

 }

 param {

   lr_mult: 2

 }

 convolution_param {

   num_output: 50

   kernel_size: 5

   stride: 1

   weight_filler {

     type: “xavier”

   }

   bias_filler {

     type: “constant”

   }

 }

}

***********************************************************6

layer {

 name: “pool2”

 type: “Pooling”

 bottom: “conv2”

 top: “pool2”

 pooling_param {

   pool: MAX

   kernel_size: 2

   stride: 2

 }

}

***********************************************************7

layer {

 name: “ip1”

 type: “InnerProduct”

 bottom: “pool2”

 top: “ip1”

 param {

   lr_mult: 1

 }

 param {

   lr_mult: 2

 }

 inner_product_param {

   num_output: 500

   weight_filler {

     type: “xavier”

   }

   bias_filler {

     type: “constant”

   }

 }

}

************************************************************8

layer {

 name: “relu1”

 type: “ReLU”

 bottom: “ip1”

 top: “ip1”

}

************************************************************9

layer {

 name: “ip2”

 type: “InnerProduct”

 bottom: “ip1”

 top: “ip2”

 param {

   lr_mult: 1

 }

 param {

   lr_mult: 2

 }

 inner_product_param {

   num_output: 10

   weight_filler {

     type: “xavier”

   }

   bias_filler {

     type: “constant”

   }

 }

}

***********************************************************10

layer {

 name: “accuracy”

 type: “Accuracy”

 bottom: “ip2”

 bottom: “label”

 top: “accuracy”

 include {

   phase: TEST

 }

}

************************************************************11

layer {

 name: “loss”

 type: “SoftmaxWithLoss”

 bottom: “ip2”

 bottom: “label”

 top: “loss”

}

 

 

 

2.lenet_solver.prototxt 檔

# The train/test net protocol buffer definition

net: “examples/mnist/lenet.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

3.train_lenet.sh

作用:用裡面的內建程式 caffe 執行 lenet_solver.prototxt 檔案

 

內容:

#!/usr/bin/env sh

./build/tools/caffe train –solver=examples/mnist/lenet_solver.prototxt

 

 

 

 

 

0 0 votes
Article Rating
Subscribe
Notify of
guest

2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Eddie
Eddie
7 years ago

請問一下這個有辦法用opencv 來做嗎??
版主回覆:(03/19/2017 11:34:30 PM)
應該是可以喔
可以安裝opencv的 python 包
就可以結合caffe 使用了

鈞
6 years ago

您好 我想請問一下 若要微調成自己的分類且已完成訓練的話,例如分男女生兩類,
那麼在synset_words.txt上面調整label的名稱該如何設定呢?
版主回覆:(03/24/2018 05:46:35 PM)
你是在問imagenet的synset_words檔吧?
那個好像是輸出對照而已喔
如果要製作自己的data並做訓練的話
可以參考我的caffe data 製作教學
http://darren1231.pixnet.net/blog/post/328463403-%E5%AD%B8%E6%9C%83%E5%81%9A%E5%87%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E6%95%B8%E6%93%9A%E9%9B%86%28imdb%29–caffe