您的位置:首页 > Web前端

Caffe官方教程翻译(4):CIFAR-10 turorial

2018-02-25 08:46 525 查看

前言

最近打算重新跟着官方教程学习一下caffe,顺便也自己翻译了一下官方的文档。自己也做了一些标注,都用斜体标记出来了。中间可能额外还加了自己遇到的问题或是运行结果之类的。欢迎交流指正,拒绝喷子!

官方教程的原文链接:http://caffe.berkeleyvision.org/gathered/examples/cifar10.html

Alex’s CIFAR-10 tutorial, Caffe style

Alex Krizhevskycuda-convert详细描述了在CIFAR-10数据集上取得了不错的表现的模型的定义,参数,以及训练过程等信息。这个例子就是对他的研究结果的基于caffe复现。

事先声明,我们默认你已经成功地编译了Caffe源码。如果没有,请参考Installation Page。在这篇教程中,我们也默认认为你的caffe安装在CAFFE_ROOT

感谢@chyojn对定义模型的模式和解决方案的配置提供帮助。

这个例子也还只会一个半成品。最好还是进一步解释网络和训练选择的细节,并对整个训练进行基准测试。

准备数据集

首先你需要从CIFAR-10 website下载并转换数据集。为了做到这个,直接运行下面的命令:

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


如果终端反馈报错说
wget
或是
gunzip
没有安装,你还需要分别安装他们。在运行了上面的脚本之后,就可以得到数据集:./cifar10-leveldb,还有数据集图像均值文件:./mean.binaryproto

模型

CIFAT-10模型是一个由卷积层、池化层、ReLu非线性单元、以及对比规范化的卷积神经网络,在所有层的最上层有一个线性分类器。我们已经把这个模型定义在了:CAFFE_ROOT/examples/cifar10/cifar10_quick_train_test.prototxt

训练并测试”快捷“模型

在你已经写好了定义网络的prorbuf和解决方案的protobuf后,训练模型是很简单的(参考MNIST Tutorial)。直接运行train_quick.sh,或是输入如下指令:

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


train_quick.sh是一个很简单的脚本,所以打开它看看。主要的训练工具就是有train模式的caffe,并且解决方案的protobuf是他的根据。

当你运行代码时,可以看到如下信息一闪而过:

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是训练的损耗函数。对于测试阶段的输出值,score 0表示的是准确率,score 1表示额是测试集的loss函数输出值。

喝杯咖啡去吧,回来差不多就结束了。

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%的准确率。模型的参数都保存在了一个二进制protobuf文件中:cifar10_quick_iter_5000。保存好的这个模型文件也可以在CPUGPU模式下进行部署。如果要在新的数据集下部署这个模型,请查阅CAFFE_ROOT/examples/cifar10/cifar10_quick.prototxt文件。

为什么要在GPU上训练?

尽管CIFAR-10数据集依然比较小,但却已经有足够多的数据使得GPU的训练显得很有吸引了了。

如果要对比GPUCPU的训练速度,可以在cifar*solver.prototxt中修改一行:

# solver mode: CPU or GPU
solver_mode: CPU


然后你就可以使用CPU模式来训练了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: