我这20MB的网速都下不下来,我觉得你还是放弃这个模型训练吧,谈费劲,看看得了,我就直接机翻粘过来得了,懒得校对了。
Alex的CIFAR-10教程,Caffe风格
Alex Krizhevsky的cuda-convnet详细介绍了模型定义,参数和培训程序,以便在CIFAR-10上获得良好的性能。这个例子再现了他在Caffe的结果。
我们将假设你已经成功编译了Caffe。如果没有,请参阅安装页面。在本教程中,我们假设您的caffe安装位于CAFFE_ROOT
。
我们感谢@chyojn定义模型模式和求解器配置的pull请求。
这个例子是一个正在进行的工作。这将是很高兴进一步解释网络和培训选择的细节和基准的全面培训。
准备数据集
您首先需要从CIFAR-10网站下载并转换数据格式。为此,只需运行以下命令:
cd $CAFFE_ROOT
./data/cifar10/get_cifar10.sh
./examples/cifar10/create_cifar10.sh
如果它抱怨wget
或gunzip
没有安装,你需要分别安装它们。运行脚本后应该有数据集./cifar10-leveldb
,和数据集图像的意思./mean.binaryproto
。
该模型
CIFAR-10模型是一个CNN,它包括卷积,合并,整流线性单位(ReLU)非线性的层,以及局部对比度归一化,在其顶部的线性分类器。我们已经在CAFFE_ROOT/examples/cifar10
目录中定义了模型cifar10_quick_train_test.prototxt
。
培训和测试“快速”模型
在编写网络定义protobuf和solver protobuf文件(参见MNIST教程)之后,训练模型很简单。只需运行train_quick.sh
,或直接执行以下命令:
cd $CAFFE_ROOT
./examples/cifar10/train_quick.sh
train_quick.sh
是一个简单的脚本,所以看看里面。培训的主要工具是caffe
与train
行动,并求解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
基于求解器设置,我们将每100次迭代打印训练损耗函数,并且每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
是训练函数。对于测试阶段的输出,得分0是准确度,得分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%的测试精度。模型参数以二进制protobuf格式存储
cifar10_quick_iter_5000
这是准备部署在CPU或GPU模式!请参阅CAFFE_ROOT/examples/cifar10/cifar10_quick.prototxt
可在新数据上调用的部署模型定义。
为什么要在GPU上训练?
CIFAR-10,虽然仍然很小,有足够的数据使GPU训练有吸引力。
要比较CPU和GPU训练速度,只需更改一行cifar*solver.prototxt
:
# solver mode: CPU or GPU
solver_mode: CPU
你将使用CPU进行培训。