centos7 caffe入門與實(shí)踐-LeNet MNIST 教程

官網(wǎng)提供了大量案例。一般把數(shù)據(jù)源放在 $CAFFE_ROOT/data 文件夾下面呀忧。處理后的數(shù)據(jù)和模型文件等放在 $CAFFE_ROOT/examples文件夾下涯捻。($CAFFE_ROOT 表示你電腦上的caffe代碼路徑吴叶。)

因此LeNet涉及兩個(gè)文件夾 $CAFFE_ROOT/data 和 $CAFFE_ROOT/examples :

一,準(zhǔn)備數(shù)據(jù)

MNIST數(shù)據(jù): $CAFFE_ROOT/data/mnist/ 存放數(shù)據(jù)源烟勋,但是你會(huì)發(fā)現(xiàn) 只有一個(gè) get_mnist.sh 腳本,運(yùn)行它就可以幫我們下載數(shù)據(jù)筐付。

cd $CAFFE_ROOT ? 安裝的caffe路徑

./data/mnist/get_mnist.sh #得到MNIST數(shù)據(jù)


轉(zhuǎn)換格式為 LMDB(上篇文章已經(jīng)提到過caffe支持的幾種數(shù)據(jù)格式)

cd $CAFFE_ROOT

./examples/mnist/create_mnist.sh #官方給出的專門轉(zhuǎn)換MNIST數(shù)據(jù)格式的腳本

得到下面兩個(gè)文件


二卵惦,配置網(wǎng)絡(luò)結(jié)構(gòu)

官網(wǎng)提供了定義好的網(wǎng)絡(luò)文件 $CAFFE_ROOT/examples/mnist/lenet_train_test.prototxt 其內(nèi)容如下:

name: "LeNet"

layer {

name: "mnist"

type: "Data" #數(shù)據(jù)層

top: "data"

top: "label"

include {

phase: TRAIN #訓(xùn)練時(shí)才加載

}

transform_param {

scale: 0.00390625 #每個(gè)像素乘以改值做歸一化(1/255 = 0.00390625)

}

data_param {

source: "examples/mnist/mnist_train_lmdb" #前面生成的訓(xùn)練數(shù)據(jù)集

batch_size: 64 # 每一批訓(xùn)練集大小

backend: LMDB #數(shù)據(jù)格式

}

}

layer {

name: "mnist"

type: "Data" #數(shù)據(jù)層

top: "data"

top: "label"

include {

phase: TEST #測試時(shí)才加載

}

transform_param {

scale: 0.00390625

}

data_param {

source: "examples/mnist/mnist_test_lmdb" #前面生成的測試數(shù)據(jù)集

batch_size: 100

backend: LMDB

}

}

layer {

name: "conv1"

type: "Convolution" #卷積層

bottom: "data"

top: "conv1"

param {

lr_mult: 1 #weights學(xué)習(xí)率

}

param {

lr_mult: 2 #bias學(xué)習(xí)率

}

convolution_param {

num_output: 20 #輸出多少個(gè)特征圖(對應(yīng)卷積核數(shù)量)

kernel_size: 5 #卷積核大小

stride: 1 #步長

weight_filler {

type: "xavier" #權(quán)重初始化算法

}

bias_filler {

type: "constant" #基值初始化算法

}

}

}

layer {

name: "pool1"

type: "Pooling" #池化層

bottom: "conv1"

top: "pool1"

pooling_param {

pool: MAX #池化方法

kernel_size: 2

stride: 2

}

}

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"

}

}

}

layer {

name: "pool2"

type: "Pooling"

bottom: "conv2"

top: "pool2"

pooling_param {

pool: MAX

kernel_size: 2

stride: 2

}

}

layer {

name: "ip1"

type: "InnerProduct" #全鏈接層

bottom: "pool2"

top: "ip1"

param {

lr_mult: 1 #weights學(xué)習(xí)率

}

param {

lr_mult: 2 #bias學(xué)習(xí)率

}

inner_product_param {

num_output: 500

weight_filler {

type: "xavier"

}

bias_filler {

type: "constant"

}

}

}

layer {

name: "relu1"

type: "ReLU" #relu層

bottom: "ip1"

top: "ip1"

}

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"

}

}

}

layer {

name: "accuracy"

type: "Accuracy" #輸出精度

bottom: "ip2"

bottom: "label"

top: "accuracy"

include {

phase: TEST

}

}

layer {

name: "loss"

type: "SoftmaxWithLoss" #輸出損失

bottom: "ip2"

bottom: "label"

top: "loss"

}

可以用 官方自帶的python繪圖工具繪制出網(wǎng)絡(luò)圖:

三,配置網(wǎng)絡(luò)求解文件

官網(wǎng)給出了一個(gè)求解文件:$CAFFE_ROOT/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. 設(shè)置每500次測試一下網(wǎng)絡(luò) 精度 損失

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? 設(shè)置每100次迭代訓(xùn)練顯示當(dāng)前狀態(tài) lr loss

display: 100

# The maximum number of iterations

max_iter: 10000

# snapshot intermediate results 中間結(jié)果快照每5000次保存一次

snapshot: 5000

snapshot_prefix: "examples/mnist/lenet"

# solver mode: CPU or GPU

solver_mode: GPU

四瓦戚,訓(xùn)練

cd $CAFFE_ROOT

./examples/mnist/train_lenet.sh

其內(nèi)容如下:

#!/usr/bin/env sh

set -e

./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt $@

可見只是調(diào)用前一篇文章 (caffe入門時(shí)間-簡介) 已經(jīng)提到過的 命令行接口沮尿。

然后得到一堆的輸出信息:

#solver文件設(shè)置每100次迭代訓(xùn)練顯示當(dāng)前狀態(tài) lr loss

I1203 solver.cpp:204] Iteration 100, lr = 0.00992565? #學(xué)習(xí)率

I1203 solver.cpp:66] Iteration 100, loss = 0.26044 #損失

...

#solver文件設(shè)置每500次測試一下網(wǎng)絡(luò) 精度 損失

I1203 solver.cpp:84] Testing net

I1203 solver.cpp:111] Test score #0: 0.9785 #精度

I1203 solver.cpp:111] Test score #1: 0.0606671 #損失

訓(xùn)練結(jié)束后,輸出信息可以看到最終的精度和損失伤极。 在 $CAFFE_ROOT/examples/mnist 文件夾下可以看到 如下文件蛹找。 迭代5000次的中間狀態(tài)快照 (.solverstate文件姨伤,可用于恢復(fù)網(wǎng)絡(luò)訓(xùn)練)和模型 (.caffemodel文件,可用于下一步測試)庸疾,迭代10000次的中間狀態(tài)快照和模型


備注:由于我們在solver中設(shè)置了每500做一下測試乍楚。所以實(shí)際上上面 ./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt 的過程包含了訓(xùn)練和間隔測試。這樣做有助于我們對網(wǎng)絡(luò)訓(xùn)練的中間過程有直觀感受届慈。

五徒溪,測試



# 參數(shù)包括:網(wǎng)絡(luò)結(jié)構(gòu)模型文件(.prototxt 注意不是求解文件solover) 訓(xùn)練好的模型參數(shù)(.caffemodel) 迭代測試100次(前面訓(xùn)練和間隔測試時(shí)是在solver文件中定義的 此處則用命令行寫明)

cd $CAFFE_ROOT

build/tools/caffe test -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel? -iterations 100



測試可以達(dá)到 0.9948的精度,0.0182697的損失率金顿。

?實(shí)戰(zhàn)二: 用python接口調(diào)用訓(xùn)練號的模型識別數(shù)字臊泌。

圖片:


#編寫python調(diào)用模型預(yù)測圖片是數(shù)字幾:

import os

import sys

import numpy as np

import matplotlib.pyplot as plt

caffe_root = '你的caffe路徑'

sys.path.insert(0, caffe_root + 'python') #把pycaffe所在路徑添加到環(huán)境變量

import caffe

#指定網(wǎng)絡(luò)結(jié)構(gòu) 與 lenet_train_test.prototxt不同

MODEL_FILE = '你的caffe路徑/examples/mnist/lenet.prototxt'

PRETRAINED = '你的caffe路徑/examples/mnist/lenet_iter_10000.caffemodel'

#圖片已經(jīng)處理成 lenet.prototxt的輸入要求(尺寸28x28)且已經(jīng)二值化為黑白色

IMAGE_FILE = '你的caffe路徑/examples/images/test4.bmp'

input_image = caffe.io.load_image(IMAGE_FILE, color=False)

net = caffe.Classifier(MODEL_FILE, PRETRAINED)

prediction = net.predict([input_image], oversample = False)

caffe.set_mode_cpu()

print 'predicted class:', prediction[0].argmax()

結(jié)果預(yù)測為數(shù)字 4:


相關(guān)代碼和圖片在https://github.com/andylei77/Learning-caffe/tree/master/Lenet-mnist

適用于本Linux (適用于一次執(zhí)行)

#編寫python調(diào)用模型預(yù)測圖片是數(shù)字幾:

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

import os

import numpy as np

import matplotlib.pyplot as plt

caffe_root = 'caffe'

sys.path.insert(0, caffe_root + 'python') #把pycaffe所在路徑添加到環(huán)境變量

import caffe

#指定網(wǎng)絡(luò)結(jié)構(gòu) 與 lenet_train_test.prototxt不同

MODEL_FILE = 'caffe/examples/mnist/lenet.prototxt'

PRETRAINED = 'caffe/examples/mnist/lenet_iter_10000.caffemodel'

#圖片已經(jīng)處理成 lenet.prototxt的輸入要求(尺寸28x28)且已經(jīng)二值化為黑白色

IMAGE_FILE = 'caffe/examples/images/test4.bmp'

input_image = caffe.io.load_image(IMAGE_FILE, color=False)

net = caffe.Classifier(MODEL_FILE, PRETRAINED)

prediction = net.predict([input_image], oversample = False)

caffe.set_mode_cpu()

print 'predicted class:', prediction[0].argmax()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市揍拆,隨后出現(xiàn)的幾起案子渠概,更是在濱河造成了極大的恐慌,老刑警劉巖嫂拴,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件播揪,死亡現(xiàn)場離奇詭異,居然都是意外死亡筒狠,警方通過查閱死者的電腦和手機(jī)猪狈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辩恼,“玉大人雇庙,你說我怎么就攤上這事≡钜粒” “怎么了疆前?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谁帕。 經(jīng)常有香客問我峡继,道長,這世上最難降的妖魔是什么匈挖? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任碾牌,我火速辦了婚禮,結(jié)果婚禮上儡循,老公的妹妹穿的比我還像新娘舶吗。我一直安慰自己,他們只是感情好择膝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布誓琼。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腹侣。 梳的紋絲不亂的頭發(fā)上叔收,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機(jī)與錄音傲隶,去河邊找鬼饺律。 笑死,一個(gè)胖子當(dāng)著我的面吹牛跺株,可吹牛的內(nèi)容都是我干的复濒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼乒省,長吁一口氣:“原來是場噩夢啊……” “哼巧颈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起袖扛,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤砸泛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后攻锰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晾嘶,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年娶吞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片械姻。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妒蛇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出楷拳,到底是詐尸還是另有隱情绣夺,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布欢揖,位于F島的核電站陶耍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏她混。R本人自食惡果不足惜烈钞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坤按。 院中可真熱鬧毯欣,春花似錦、人聲如沸臭脓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至砚作,卻和暖如春窘奏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背葫录。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工着裹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人压昼。 一個(gè)月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓求冷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窍霞。 傳聞我的和親對象是個(gè)殘疾皇子匠题,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容