centos7 caffe入门与实践-LeNet MNIST 教程

官网提供了大量案例。一般把数据源放在 $CAFFE_ROOT/data 文件夹下面。处理后的数据和模型文件等放在 $CAFFE_ROOT/examples文件夹下。($CAFFE_ROOT 表示你电脑上的caffe代码路径。)

因此LeNet涉及两个文件夹 $CAFFE_ROOT/data 和 $CAFFE_ROOT/examples :

一,准备数据

MNIST数据: $CAFFE_ROOT/data/mnist/ 存放数据源,但是你会发现 只有一个 get_mnist.sh 脚本,运行它就可以帮我们下载数据。

cd $CAFFE_ROOT   安装的caffe路径

./data/mnist/get_mnist.sh #得到MNIST数据


转换格式为 LMDB(上篇文章已经提到过caffe支持的几种数据格式)

cd $CAFFE_ROOT

./examples/mnist/create_mnist.sh #官方给出的专门转换MNIST数据格式的脚本

得到下面两个文件


二,配置网络结构

官网提供了定义好的网络文件 $CAFFE_ROOT/examples/mnist/lenet_train_test.prototxt 其内容如下:

name: "LeNet"

layer {

name: "mnist"

type: "Data" #数据层

top: "data"

top: "label"

include {

phase: TRAIN #训练时才加载

}

transform_param {

scale: 0.00390625 #每个像素乘以改值做归一化(1/255 = 0.00390625)

}

data_param {

source: "examples/mnist/mnist_train_lmdb" #前面生成的训练数据集

batch_size: 64 # 每一批训练集大小

backend: LMDB #数据格式

}

}

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

}

}

layer {

name: "conv1"

type: "Convolution" #卷积层

bottom: "data"

top: "conv1"

param {

lr_mult: 1 #weights学习率

}

param {

lr_mult: 2 #bias学习率

}

convolution_param {

num_output: 20 #输出多少个特征图(对应卷积核数量)

kernel_size: 5 #卷积核大小

stride: 1 #步长

weight_filler {

type: "xavier" #权重初始化算法

}

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学习率

}

param {

lr_mult: 2 #bias学习率

}

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绘图工具绘制出网络图:

三,配置网络求解文件

官网给出了一个求解文件:$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. 设置每500次测试一下网络 精度 损失

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  设置每100次迭代训练显示当前状态 lr loss

display: 100

# The maximum number of iterations

max_iter: 10000

# snapshot intermediate results 中间结果快照每5000次保存一次

snapshot: 5000

snapshot_prefix: "examples/mnist/lenet"

# solver mode: CPU or GPU

solver_mode: GPU

四,训练

cd $CAFFE_ROOT

./examples/mnist/train_lenet.sh

其内容如下:

#!/usr/bin/env sh

set -e

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

可见只是调用前一篇文章 (caffe入门时间-简介) 已经提到过的 命令行接口。

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

#solver文件设置每100次迭代训练显示当前状态 lr loss

I1203 solver.cpp:204] Iteration 100, lr = 0.00992565  #学习率

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

...

#solver文件设置每500次测试一下网络 精度 损失

I1203 solver.cpp:84] Testing net

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

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

训练结束后,输出信息可以看到最终的精度和损失。 在 $CAFFE_ROOT/examples/mnist 文件夹下可以看到 如下文件。 迭代5000次的中间状态快照 (.solverstate文件,可用于恢复网络训练)和模型 (.caffemodel文件,可用于下一步测试),迭代10000次的中间状态快照和模型


备注:由于我们在solver中设置了每500做一下测试。所以实际上上面 ./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt 的过程包含了训练和间隔测试。这样做有助于我们对网络训练的中间过程有直观感受。

五,测试



# 参数包括:网络结构模型文件(.prototxt 注意不是求解文件solover) 训练好的模型参数(.caffemodel) 迭代测试100次(前面训练和间隔测试时是在solver文件中定义的 此处则用命令行写明)

cd $CAFFE_ROOT

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



测试可以达到 0.9948的精度,0.0182697的损失率。

 实战二: 用python接口调用训练号的模型识别数字。

图片:


#编写python调用模型预测图片是数字几:

import os

import sys

import numpy as np

import matplotlib.pyplot as plt

caffe_root = '你的caffe路径'

sys.path.insert(0, caffe_root + 'python') #把pycaffe所在路径添加到环境变量

import caffe

#指定网络结构 与 lenet_train_test.prototxt不同

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

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

#图片已经处理成 lenet.prototxt的输入要求(尺寸28x28)且已经二值化为黑白色

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()

结果预测为数字 4:


相关代码和图片在https://github.com/andylei77/Learning-caffe/tree/master/Lenet-mnist

适用于本Linux (适用于一次执行)

#编写python调用模型预测图片是数字几:

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所在路径添加到环境变量

import caffe

#指定网络结构 与 lenet_train_test.prototxt不同

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

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

#图片已经处理成 lenet.prototxt的输入要求(尺寸28x28)且已经二值化为黑白色

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()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容