本文为caffe官网上ImageNet教程翻译,地址:http://caffe.berkeleyvision.org/gathered/examples/imagenet.html


本教程旨在教我们用自己的数据训练模型。caffe官网的model zoo里已经提供了训练好的模型。

数据准备

本教程假定所有的命令都在caffe根目录下执行。
这里提到的”ImageNet”是指ILSVRC2012挑战赛中的数据库,当然也可以在整个ImageNet上训练,只是需要更大容量的硬盘和更长的时间。
现假定已经下载好了ImageNet训练数据和验证数据,它们存储的方式如下:

/path/to/imagenet/train/n01440764/n01440764_10026.JPEG
/path/to/imagenet/val/ILSVRC2012_val_00000001.JPEG

首先需要准备一些辅助数据来训练,用如下命令下载数据:

 ./data/ilsvrc12/get_ilsvrc_aux.sh

训练和验证输入作为文本文件存放在train.txtval.txt中,同时注明标签。注意这里所采用的标签索引与ILSVRC工具包有所不同,这里是按ASCII码表对类进行排序,然后标签依次为0~999。 你可能需要先将输入图片剪裁为256×256大小。Yangqing使用了他的micepie包。如果你希望简单点,也可以使用shell命令,比如:

for name in /path/to/imagenet/val/*.JPEG; doconvert -resize 256x256\! $name $name
done

examples/imagenet/create_imagenet.sh文件中,按自己的需要设置训练和验证目录,如果事先没有剪裁图片可通过设置RESIZE=true来将图片切割为256×256大小。现在,便可以用examples/imagenet/create_imagenet.sh来创建leveldbs格式的数据库了。注意,
examples/imagenet/ilsvrc12_train_leveldbexamples/imagenet/ilsvrc12_val_leveldb在执行前是不能存在的,因为它们将通过脚本自动生成。GLOG_logtostderr=1是用来检查的转储信息,可忽略。

计算图像均值

模型需要从每张图像中减去图像均值,因此我们需要首先计算均值。 tools/compute_image_mean.cpp文件是一个非常好的例子使我们熟悉并使用众多组件,如proto buffer,leveldbs以及logging。计算图像均值可使用如下命令:

./examples/imagenet/make_imagenet_mean.sh

执行后将生成data/ilsvrc12/imagenet_mean.binaryproto文件。

模型定义

下面要介绍由Krizhevsky, Sutskever, 和Hinton三人在NIPS 2012 paper上的模型。
网络定义(models/bvlc_reference_caffenet/train_val.prototxt) 遵从AlexNet网络。注意如果想更改文件路径,那么必须和.prototxt文件中的路径相一致。
如果你仔细看过了models/bvlc_reference_caffenet/train_val.prototxt文件,将注意到在多个include部分有{phase:TRAIN}{phase:TEST}。这些使得我们可以在同一个文件中定义该网络是用来训练或用来测试。这两个网络几乎完全一样,除了标有{phase:TRAIN}{phase:TEST}的层不一样以外,其余的层完全一致。在这种情况下,只有输入层和输出层不同。
输入层区别:训练网络的data输入层从examples/imagenet/ilsvrc12_train_leveldb下载数据,并对随机对图像取镜像。测试网络的data输入层从examples/imagenet/ilsvrc12_val_leveldb下载数据,不对图像取镜像。
输出层区别:两个网络的输出层都是sofxmax_loss层,在训练中该层用来计算损失函数来初始化反向传播,在验证过程中仅将该损失值打印出来。在测试网络中同时还有第二个输出层:accuracy,该层用来显示在测试集上的准确率。在训练过程中,测试网络偶尔会在测试集上进行测试,产生两行类似Test score #0: xxxTest score #1: xxx这样的输出。在这里,score 0是准确率(对于未经训练的网络该值约从1/1000=0.001开始),score 1是损失值(对于未经训练的网络该值约从7开始)。
solver文件中的参数配置参考如下:

  • batch大小设为256,总共450,000次迭代;
  • 每1,000次迭代,在验证数据上测试一次学习网络;
  • 学习率初始值为0.01,每100,000次迭代递减;
  • 每20次迭代打印一次信息;
  • momentum初始值为0.9,权重递减值为0.0005;
  • 每10,000次迭代,对当前信息取一次快照
    这些参数均在models/bvlc_reference_caffenet/solver.prototxt文件中声明。

训练网络

执行如下命令开始训练网络:

./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt

在K40机器上,每20次迭代大约花费26.5s(在K20上花费36s),因此对于一个完全的前-后向传播,每张图片需要消耗5.2s,其中2s用来前向传播,其余时间用来后向传播。如果想仔细了解计算时间,可执行命令:

./build/tools/caffe time --model=models/bvlc_reference_caffenet/train_val.prototxt

恢复训练

由于之前我们及时的存储了训练过程中的相关进度,所以可以利用snapshots恢复训练,修改文件如下:

./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脚本中存储了所有需要的信息(包括参数、momentum历史值等等)。

caffe教程翻译:在caffe上训练与测试数据相关推荐

  1. Caffe 在自己的数据库上训练步骤

    回忆ImageNet的步骤:http://caffe.berkeleyvision.org/gathered/examples/imagenet.html Brewing ImageNet This ...

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

    原文地址:http://caffe.berkeleyvision.org/gathered/examples/cifar10.html 本文假设caffe安装在根目录CAFFE_ROOT下 数据准备 ...

  3. c++调用caffe ssd_【caffe教程5】caffe中的卷积

    本文首发于公众号<有三AI> [caffe解读] caffe从数学公式到代码实现5-caffe中的卷积​mp.weixin.qq.com 今天要讲的就是跟卷积相关的一些layer了 im2 ...

  4. Caffe官方教程翻译(10):Editing model parameters

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

  5. Caffe官方教程翻译(9):Multilabel Classification with Python Data Layer

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

  6. Caffe官方教程翻译(8):Brewing Logistic Regression then Going Deeper

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

  7. Caffe官方教程翻译(7):Fine-tuning for Style Recognition

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

  8. Caffe官方教程翻译(6):Learning LeNet

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

  9. Caffe官方教程翻译(5):Classification: Instant Recognition with Caffe

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

最新文章

  1. java switch null_[改善Java代码]小心switch带来的空值异常
  2. 在Qt工程文件中根据不同版本号使用不同源码
  3. 机器学习(三十一)——Linear Discriminant Analysis
  4. 普罗米修斯监控系统_基于Prometheus和Grafana的监控平台 - 环境搭建
  5. 计算机网络 --- 传输层
  6. python绘制多边形样例_Python PIL ImageDraw.Draw.polygon()用法及代码示例
  7. 文件选择器看这个就够了—轻量级、支持多种文件类型
  8. 【转】Linux 的启动流程
  9. 银行代码就是银行行号吗?
  10. 谷歌云盘将共享链接中的文件保存到自己的云盘中
  11. MathType编辑的公式与文字不对齐
  12. Android Home键拦截
  13. 被雅虎3000万美金收购的Summly没有核心技术!
  14. Python的自省函数
  15. 30个 开发商logo - 商标制作 - ci vi设计
  16. 提质信创•协同发展—— 麒麟信安云+操作系统交流会(武汉站)顺利举行
  17. 在51单片机上跑RTOS有没有意义?
  18. 数据结构与算法之美笔记——基础篇(中):树,二叉树,二叉查找树,平衡二叉查找树,红黑树,递归树,堆
  19. keystore提取私钥和证书
  20. 圣诞节贺卡计算机基础知识,圣诞贺卡怎么制作 百度圣诞卡制作图文教程-电脑教程...

热门文章

  1. Tensorflow运行程序报错 FailedPreconditionError
  2. 图层几何学 -- iOS Core Animation 系列二
  3. iOS如何查看静态库.a文件支持的cpu类型
  4. 基于vue-cli配置手淘的lib-flexible + rem,实现移动端自适应
  5. quartz分布式集群部署并且可视化配置job定时任务
  6. javascript 中的getter,setter
  7. Linux 下Oracle Client JAVA JDBC 集成点滴
  8. 整型数与字符串之间的转化
  9. NYOJ 203 三国志(Dijkstra+贪心)
  10. 查阅文献时向原作者发邮件要文献的简单模板