首页 > 代码库 > Caffe ImageNet官方文档中文版
Caffe ImageNet官方文档中文版
文档大部分都是机翻,本人英语未过四级,所以凑合看吧
构建ImageNet
本指南旨在让您准备好根据自己的数据训练自己的模型。如果你只是想要一个ImageNet训练的网络,那么注意,由于训练需要很多电能,我们讨厌全球变暖,我们在model zoo提供如下所述训练的CaffeNet模型。
数据准备
该指南指定所有路径并假定所有命令都从根caffe目录执行。(即~/caffe)
通过“ImageNet”我们这里意味着ILSVRC12挑战,但你也可以轻松地训练整个ImageNet,只是需要更多的磁盘空间,和一个更长的训练时间。
我们假设您已经下载了ImageNet培训数据和验证数据,并且它们存储在您的磁盘上,如:
/path/to/imagenet/train/n01440764/n01440764_10026.JPEG
/path/to/imagenet/val/ILSVRC2012_val_00000001.JPEG
您将首先需要准备一些辅助数据进行培训。此数据可通过以下方式下载:(在caffe目录下直接执行即可)
./data/ilsvrc12/get_ilsvrc_aux.sh
训练数据和验证数据输入在文本中描述train.txt和val.txt列出所有文件及其标签。注意,我们使用不同于ILSVRC devkit的标签索引:我们按照ASCII顺序对synset名称进行排序,然后将它们从0标记到999.可以在synset_words.txt中看到 synset/name的映射关系。
您可能需要提前将图像调整为256x256。默认情况下,我们不鼓励这样做,因为在集群环境中,使用mapreduce并行方式调整图像大小获益。例如,扬清使用他的轻量的mincepie包。如果你宁愿事情更简单,你也可以使用shell命令,如:
for name in /path/to/imagenet/val/*.JPEG; do
convert -resize 256x256\! $name $name
done
看看examples/imagenet/create_imagenet.sh。根据需要设置训练和测试数据文件夹的路径,并设置“RESIZE = true”将所有图像调整为256x256,如果您没有提前调整图像大小现在只需使用 examples/imagenet/create_imagenet.sh创建leveldbs。请注意,examples/imagenet/ilsvrc12_train_leveldb而examples/imagenet/ilsvrc12_val_leveldb不应这种执行前就存在。它将由脚本创建。GLOG_logtostderr=1只是转储更多的信息供您检查,您可以安全地忽略它。
计算图像平均值
该模型要求我们从每个图像中减去图像平均值,因此我们必须计算平均值。tools/compute_image_mean.cpp实现它 - 它也是一个很好的例子,让您熟悉如何操作多个组件,如协议缓冲区,leveldbs和日志记录,如果你不熟悉他们。无论如何,平均计算可以用下面这个文件直接执行输出:
./examples/imagenet/make_imagenet_mean.sh
这将创建 data/ilsvrc12/imagenet_mean.binaryproto。
模型定义
我们将描述Krizhevsky,Sutskever和Hinton在他们的NIPS 2012论文中首先提出的方法的参考实现。
网络定义(models/bvlc_reference_caffenet/train_val.prototxt)遵循Krizhevsky et al。请注意,如果您偏离本指南中建议的文件路径,则需要调整.prototxt文件中的相关路径。
如果你仔细看models/bvlc_reference_caffenet/train_val.prototxt,你会注意到几个include部分指定phase: TRAIN或phase: TEST。这些部分允许我们在一个文件中定义两个密切相关的网络:用于训练的网络和用于测试的网络。这两个网络几乎相同,共享除了用include { phase: TRAIN }或标记的那些层之外的所有层include { phase: TEST }。在这种事件下,只有输入层和一个输出层不同。
输入层差异:训练网络的data输入层从examples/imagenet/ilsvrc12_train_leveldb输入图像中提取其数据并随机镜像。测试网络的data层从数据获取数据,examples/imagenet/ilsvrc12_val_leveldb不执行随机镜像。
输出层差异:两个网络都输出softmax_loss层,其在训练中用于计算损失函数和初始化反向传播,而在验证中这个损失被简单报告。测试网络还具有第二输出层,accuracy其用于报告测试集上的精度。在训练过程中,测试网络偶尔会在测试集上进行实例化和测试,生成类似Test score #0: xxx和Test score #1: xxx。在这种情况下,分数0是准确度(对于未经训练的网络,其将从1/1000 = 0.001开始),分数1是损失(对于未训练的网络,其将从7开始)。
我们还将布置一个用于运行解算器的协议缓冲区。让我们做几个计划:
我们将以256的批次运行,并运行总共450,000次迭代(约90个周期)。
对于每1000次迭代,我们使用验证数据测试学习网络。
我们将初始学习速率设置为0.01,并且每100,000次迭代(大约20个周期)减少它。
每20次迭代将显示信息。
网络将训练有动量0.9和0.0005的重量衰减。
对于每10,000次迭代,我们将保存当前状态的快照。
听起来不错?这是在中实现的models/bvlc_reference_caffenet/solver.prototxt。
训练ImageNet
准备好了吗?开始训练。
./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt
坐下来享受吧!
在K40机器上,每20次迭代运行大约26.5秒(而在K20上这需要36秒),因此对于完全前向传播-反向传播过程,每个图像有效地大约5.2ms。大约2毫秒是前向的,其余的是反向的。如果你有兴趣剖析计算时间,你可以运行
./build/tools/caffe time --model=models/bvlc_reference_caffenet/train_val.prototxt
继续训练?
我们都有电源断电的经历,或者我们奖励自己一点通过玩战地(有人还记得震撼?)。由于我们在训练期间快照中间结果,我们能够从快照中恢复。这可以做到很容易:
./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt --snapshot=models/bvlc_reference_caffenet/caffenet_train_iter_10000.solverstate
其中在脚本中caffenet_train_iter_10000.solverstate是解算器状态快照,其存储用于恢复精确解算器状态(包括参数,动量历史等)的所有必要信息。
分词
希望你喜欢这个方法!自ILSVRC 2012挑战以来,许多研究人员已经走得更远,改变了网络架构或微调网络中的各种参数,以满足新的数据和任务。 Caffe让你通过简单地编写不同的prototxt文件更容易探索不同的网络选择 - 那不是很令人兴奋吗?
现在你有一个训练有素的网络,看看如何使用它和Python接口分类ImageNet。
Caffe ImageNet官方文档中文版