win10 下 caffe 的第一个测试程序(附带详细讲解)

win10 下 caffe 的第一个测试程序

该部分包括两篇文章

费尽千辛万苦,终于把 caffe 编译好了,可是怎么用了,下面透过 mnist 数据集对 caffe 有一个认识。在 caffe 根目录下 (./examplse/mnist) 有一个 mnist 文件夹,在这个文件夹中有个 readme.md,这个markdown文件就是这个测试例子的帮助文档,里面有很清楚的记录, 本文主要就是基于这个文档进行整理的。

caffe(Convolution Architecture For Feature Extraction) 是一种常用的深度学习框架,主要应用在视频、图像处理方面的应用上。另外 caffe 也提供了很多开源模型,具体可以到Model Zoo 上去查看, 这里不多作介绍。

1. 数据

1.1 caffe 支持的数据库格式

caffe 支持 leveldb,lmdb,image filelist 和 hdf5 等格式的数据库。其中leveldb是最早支持的,所以早期用的比较多,(相同数据集)lmdb 的文件 size 比 leveldb 大,但是速度更快,且允许多种训练模型同时读取同一数据集,所以现在应用的比较多。lmdb 常用于单标签数据,像分类等, 而hdf5可用于多标签数据,比如回归等问题。

其实caffe提供了相应的工具(例如/build/tools/Release/convert_imageset.exe)来制作lmdb或leveldb的数据集。

1.2 mnist 数据集

MNIST 数据集可在 http://yann.lecun.com/exdb/mnist/ 获取, 它包含了四个部分:每张图都已经进行尺寸归一化,数字居中处理,固定尺寸为 28×28。

  • Training set images: train-images-idx3-ubyte.gz (9.45MB, 包含60,000个样本)
  • Training set labels: train-labels-idx1-ubyte.gz (28.2KB, 包含60,000个标签)
  • Test set images: t10k-images-idx3-ubyte.gz (1.57MB, 包含10,000个样本)
  • Test set labels: t10k-labels-idx1-ubyte.gz (4.43KB, 包含10,000个标签)

关于 mnist 数据集的介绍这里就不在赘述了。需要注意的是从官方网站上下载得到的文件是二进制数据。帮助文件上说运行对应脚本就可以下载并转换数据格式为 lmdb。 但是我发现我的 mnist 文件夹下没有 get_mnist.ps1 这个文件。所以直接在网上下载了已经转换好格式的文件(mnist_test_leveldb 和 mnist_train_leveldb), 下载之后解压放在 mnist 文件夹下。

cd $CAFFE_ROOT
@ get data from internet
./data/mnist/get_mnist.ps1
@ convert data type to lmdb
./examples/mnist/create_mnist.ps1

2. 网络模型

LeNet-5 就是在数字识别的准确率上有了大幅提升而一炮走红,如下是 LeNet-5 的网络结构。但是 caffe 这个 mnist 例子中不是原封不动用的 lenet-5. 而是稍稍进行了改变。比如将sigmoid 激活函数(在 F6 层之后,下图并没有标明激活函数的位置)变为了 Rectified Linear Unit (ReLU) 激活函数。
在这里插入图片描述

3. caffe 实现

3.1 caffe 的基本结构

  • Blob
    主要用于存储(也可以说是传递)数据,包括正向的原始数据data和反向的梯度信息diffs。

  • layer
    Layer是Caffe的基本计算和转换单元。layer 的 输入为 bottom blob(s), 输出为 top blob(s)。常见的 layer 比如 Vision Layer, Loss Layers, Activation/Neuron Layer, Data Layer,Common Layers。更多可以参考拓展资料

  • net
    Net 由多个 layer 组成,是一个有向无环图(DAG)。Caffe 运行时记录每层的数据,并且确保前向(Forward)和后向(Backward)的正确性。 下图就是一个 net 示例。

  • Solver
    求解器, 比如利用反向传播来训练模型。

在这里插入图片描述

3.2 Protocol Buffers

开始看具体的代码之前, 我们需要先了解 Protocol Buffers。 因为 caffe 中就是用 proto 文件来定义网络结构的。
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。更多内容请参考拓展资料1拓展资料2

3.3 MNIST Network

mnist network (稍作修改的 Lenet5 ) 定义在 $CAFFE_ROOT/examples/mnist/lenet_train_test.prototxt 中。下面从中截取的片段。如果想知道没句代码的含义可以参考caffe demo1 & caffe demo2。 这里需要注意,下面data layer 中的 source 表示的是 data 的位置,需要和实际 data 的位置保持一致。而 backend 需要和实际 data 的类型保持一致(leveldb 或者 lmdb)

name: "LeNet"
layer {
  name: "mnist"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    scale: 0.00390625
  }
  data_param {
    source: "examples/mnist/mnist-train-leveldb"
    batch_size: 64
    backend: LEVELDB
  }
}
layer {
  name: "mnist"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    scale: 0.00390625
  }
  data_param {
    source: "examples/mnist/mnist-test-leveldb"
    batch_size: 100
    backend: LEVELDB
  }
}
...

借助可视化工具(比如 Netscope ),可以方便的以图形化的方式查看 net 的结构。下图是上面定义的 LeNet。
在这里插入图片描述

3.4 MNIST Solver

mnist solver 定义在 $CAFFE_ROOT/examples/mnist/lenet_solver.prototxt 之下,并且有比较详细的注释。只是你需要根据你的情况选择 CPU 还是 GPU 模式。

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

4. 训练并测试模型

如果在 Linux 系统下可以直接执行以下代码即可以开始。

cd $CAFFE_ROOT
./examples/mnist/train_lenet.sh

在 windows 下可以 自己写一个 batch 文件, 比如 在根目录下创建一个 mytest.bat。内容如下。

build\\tools\\Release\\caffe.exe train --solver=examples\\mnist\\lenet_solver.prototxt
pause

直接双击 batch 文件运行或者在 cmd 窗口运行都可以。下面是运行的结果。可以看到最后测试的精度为99.13%。

C:\Projects\caffe>build\\tools\\Release\\caffe.exe train --solver=examples\\mnist\\lenet_solver.prototxt
I0525 23:41:23.323810 45304 caffe.cpp:219] Using GPUs 0
I0525 23:41:23.451669 45304 caffe.cpp:224] GPU 0: GeForce GTX 1070
I0525 23:41:23.738215 45304 common.cpp:36] System entropy source not available, using fallback algorithm to generate seed instead.
I0525 23:41:23.756167 45304 solver.cpp:44] Initializing solver from parameters:
test_iter: 100
test_interval: 500
base_lr: 0.01
display: 100
max_iter: 10000
lr_policy: "inv"
gamma: 0.0001
power: 0.75
momentum: 0.9
weight_decay: 0.0005
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
solver_mode: GPU
device_id: 0
net: "examples/mnist/lenet_train_test.prototxt"
train_state {
  level: 0
  stage: ""
}

...

I0525 23:42:39.029999 45304 solver.cpp:310] Iteration 10000, loss = 0.002468
I0525 23:42:39.029999 45304 solver.cpp:330] Iteration 10000, Testing net (#0)
I0525 23:42:39.136711 45032 data_layer.cpp:73] Restarting data prefetching from start.
I0525 23:42:39.140700 45304 solver.cpp:397]     Test net output #0: accuracy = 0.9913
I0525 23:42:39.141697 45304 solver.cpp:397]     Test net output #1: loss = 0.030124 (* 1 = 0.030124 loss)
I0525 23:42:39.141697 45304 solver.cpp:315] Optimization Done.
I0525 23:42:39.141697 45304 caffe.cpp:260] Optimization Done.

如果你够细心,可能会在 cmd 窗口看到“System entropy source not available, using fallback algorithm to generate seed instead.”,实际上这个并不是错误,也不会对结果有什么影响。在 Linux 下可以通过 entropy source 更高效的生成随机数, 但是在windows 通过 fallback algorithm 获取随机数。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值