您的位置:首页 > Web前端

caffe教程翻译:Alex’s CIFAR-10 tutorial, Caffe style

2016-04-14 10:46 357 查看
原文地址:http://caffe.berkeleyvision.org/gathered/examples/cifar10.html

本文假设caffe安装在根目录
CAFFE_ROOT


数据准备

首先需要从CIFAR-10 websit网站上下载并转换数据格式。运行一下代码:

cd $CAFFE_ROOT
./data/cifar10/get_cifar10.sh
./examples/cifar10/create_cifar10.sh


如果提示
wget
gunzip
未安装,则需要分别安装它们。运行这些脚本后将产生数据集:
./cifar10-leveldb
和图像均值文件:
./mean.binaryproto


模型

Cifar-10模型一个由卷积层(convolution)、池化层(pooling)、矫正线性化单元(rectified linear unit)(ReLU)非线性(nonlinearities)、局部对比正则化(local contrast normalization),并在顶层有一个线性分类器的卷积神经网络。在
CAFFE_ROOT/examples/cifar10
目录下的
cifar10_quick_train_test.prototxt
定义了该模型。

训练并测试“快速”模型

在写好了网络定义文件和solver文件后(指MNIST Tutorial),训练十分简单。只需运行
train_quick.sh
或如下代码:

cd $CAFFE_ROOT
./examples/cifar10/train_quick.sh


train_quick.sh
是一条简单的脚本,训练的主要工具是
caffe
train
动作,在solver文件中定义了它的参数。

在运行代码过程中,会在屏幕上看到以下输出:

I0317 21:52:48.945710 2008298256 net.cpp:74] Creating Layer conv1
I0317 21:52:48.945716 2008298256 net.cpp:84] conv1 <- data
I0317 21:52:48.945725 2008298256 net.cpp:110] conv1 -> conv1
I0317 21:52:49.298691 2008298256 net.cpp:125] Top shape: 100 32 32 32 (3276800)
I0317 21:52:49.298719 2008298256 net.cpp:151] conv1 needs backward computation.


这些信息详细描述了各层之间的连接和输出形状,在调试环节很有用。初始化后,训练开始:

I0317 21:52:49.309370 2008298256 net.cpp:166] Network initialization done.
I0317 21:52:49.309376 2008298256 net.cpp:167] Memory required for Data 23790808
I0317 21:52:49.309422 2008298256 solver.cpp:36] Solver scaffolding done.
I0317 21:52:49.309447 2008298256 solver.cpp:47] Solving CIFAR10_quick_train


基于solver的配置,每100次迭代打印一次loss值,每500次进行一次测试。会看到以下信息:

I0317 21:53:12.179772 2008298256 solver.cpp:208] Iteration 100, lr = 0.001
I0317 21:53:12.185698 2008298256 solver.cpp:65] Iteration 100, loss = 1.73643
...
I0317 21:54:41.150030 2008298256 solver.cpp:87] Iteration 500, Testing net
I0317 21:54:47.129461 2008298256 solver.cpp:114] Test score #0: 0.5504
I0317 21:54:47.129500 2008298256 solver.cpp:114] Test score #1: 1.27805


对于每次训练迭代,
lr
表示学习率,
loss
表示损失函数。对于带有
testing
短语的输出, score 0代表准确率,score 1代表损失值。

一段时间后,训练结束:

I0317 22:12:19.666914 2008298256 solver.cpp:87] Iteration 5000, Testing net
I0317 22:12:25.580330 2008298256 solver.cpp:114] Test score #0: 0.7533
I0317 22:12:25.580379 2008298256 solver.cpp:114] Test score #1: 0.739837
I0317 22:12:25.587262 2008298256 solver.cpp:130] Snapshotting to cifar10_quick_iter_5000
I0317 22:12:25.590215 2008298256 solver.cpp:137] Snapshotting solver state to cifar10_quick_iter_5000.solverstate
I0317 22:12:25.592813 2008298256 solver.cpp:81] Optimization Done.


我们的模型达到了大约75%的准确率,模型参数以二进制形式存储在文件:
cifar10_quick_iter_5000
中。

参考文件
CAFFE_ROOT/examples/cifar10/cifar10_quick.prototxt
在新的数据库上应用模型。

为何在GPU上训练

cifar*solver.prototxt
文件中修改相应行,来比较CPU与GPU的训练速度:

# solver mode: CPU or GPU
solver_mode: CPU


你会发现,GPU训练更快速一些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: