深度学习的框架Caffe使用详情

caffe是一个深度学习框架,具有表达力强、速度快和模块化的思想,由伯克利视觉学习中心(bvlc)和社区贡献者开发。yangqing jia在加州大学伯克利分校攻读博士期间创建了这个项目。
为什么选择caffe?
富有表现力的架构鼓励应用和创新。使用caffe,可以在配置中定义模型和优化,不需要硬编码。通过设置一个gpu机器训练标记在cpu和gpu之间转换,接着调配商品化集群系统或移动设备来完成。
代码的可扩展性让开发更加活跃。在caffe项目的第一年,它就被开发者fork超过1000次,由他们完成许多重要的修改并反馈回来。多亏那些贡献者,这个框架在代码和模型两方面都在追踪最先进的技术。
速度使caffe完美的用于研究实验和工业开发。使用一个nvidia k40 gpu caffe每天可以处理超过60m的图像。推理过程为1ms/一幅图像,而学习过程为4ms/一幅图像。我们相信caffe是现在可使用最快的convnet应用。
社区:在视觉、速度和多媒体方面,caffe已经有能力用于学术研究项目、启动原型,甚至大规模的工业应用。
安装
在安装之前,看一下这个手册,记录下平台的一些细节。我们可以在ubuntu 16.04-12.04、os x10.11-10.8上通过docker和aws安装和运行caffe。官方的编译脚本和makefile.config编译由社区cmake编译补全。
逐步介绍:
docker setup开包即用计划
ubuntu installation标准平台
debian installation使用单个命令安装caffe
os x installation
rhel/centos/fedora installation
windows请参阅由guillaume dumont领导的windows分支
opencl请参阅由fabian tschopp领导的opencl分支
aws ami预配置为aws
必备条件
caffe有几个依赖项:
cuda是gpu模式所需要的。
推荐使用库版本7+和最新的驱动版本,但是6.*也可以。
5.5和5.0兼容但是被认为是过时的。
blas通过atlas、mkl或openblas使用。
boost>=1.55
protobuf、glog、gflags、hdf5
可选依赖项:
opencv>=2.4 包括3.0
io库:lmdb、leveldb(注意:leveldb需要snappy)
cudnn用于gpu加速(v5)
pycaffe和matcaffe接口有它们自己的需求。
对于python caffe:python 2.7或python 3.3+,numpy(>=1.7),boost条件下为boost.python
对于matlab caffe:带有mex编译器的matlab。
cudnn caffe:为了达到最快的运行速度,caffe通过插入式集成nvidia cudnn来加速。为了提升你的caffe模型的速度,安装cudnn,然后安装caffe时在makefile.config中取消注释use_cudnn:=1标记。caffe会自动进行加速。当前版本是cudnn v5;在旧版caffe中支持旧版本。
cpu-only caffe:对于cold-brewed只有cpu模式的caffe,在makefile.config中取消注释cup_only :=1标记,配置和生成没有cuda的caffe。这对于云或者集中配置非常有帮助。
cuda和blas
caffe需要cuda nvcc编译器编译它的gpu代码和用于gpu操作的cuda驱动器。可以去nuidia cuda网站,按照那里的安装说明安装cuda。分别安装库和最新的独立驱动器;驱动器和库捆绑在一起通常是过时的。警告!331.*cuda驱动器序列有严重的性能问题,不要使用它。
为获得最佳性能,caffe可以通过nvidia cudnn加速。在cudnn网站上免费注册、安装,然后继续根据安装说明操作。编译cudnn时在你的makefile.config中设置use_cudnn :=1标记。
caffe需要blas作为它的矩阵和向量计算的后端。有几个这个库的实现工具。你可以选择:
atlas:免费、开源、默认用于caffe。
intel mkl:商业的,针对intel cpus进行了优化,可以免费试用,也可以获得学生授权。
安装mkl。
设置mkl环境变量(细节:linux,os x)。例如:source /opt/intel/mkl/bin/mklvars.sh intel64
在makefile.config中设置blas := mkl
openblas:免费并开源;安装这个优化的并行的blas需要更多的工作量,虽然它可能提供加速。
安装openblas
在config中设置blas :=open
python 和 matlab caffe(可选)
python
主要依赖numpy和boost.python(由boost提供)。pandas也很有用,而且一些例子中需要它。
你可以使用下面的命令安装依赖项。
python
1 forreqin$(catrequirements.txt);dopipinstall$req;done
但是,建议先安装anaconda python发行包,它可以提供大多数必需的包和hdf5库依赖项。
在安装结束后导入caffe python模块,通过诸如export pythonpath=/path/to/caffe/python:$pythonpath添加模块目录到你的$pythonpath。不应该在caffe/python/caffe目录中导入模块。
caffe’s python接口在python2.7中工作。python3.3+应该立即可以使用,不需要protobuf支持。对于protobuf支持请安装protobuf 3.0 alpha (https://developers.google.com/protocol-buffers/)。早期版本的python需要自行探索安装方法。
matlab
安装matlab,确保$path中已加入mex。
caffe的matlab接口可以在版本2015a、2014a/b、2013a/b和2012b中工作。
编译
caffe可以使用make或cmake编译。make是官方支持,cmake由社区支持。
使用make编译
通过复制和修改示例makefile.config为安装配置生成文件。默认值应该可以工作,但是如果使用anaconda python,要取消注释对应的代码行。
python
1
2
3
4
5 cpmakefile.config.examplemakefile.config
# adjust makefile.config (for example, if using anaconda python, or if cudnn is desired)
makeall
maketest
makeruntest
对于cpu&gpu加速的caffe,不需要改变。
对于使用nvidia私有的cudnn软件的cudnn加速器,取消注释makefile.config中的use_cudnn :=1。cudnn有时比caffe的gpu加速器速度快,但不是一贯如此。
对于只有cpu的caffe,取消注释makefile.config中的cpu_only :=1。
为了编译python和matlab包装类,分别执行make pycaffe和make matcaffe。确保先在makefile.config中设置你的matlab和python路径。
分配:运行make distribute,创建一个带有所有caffe头文件的distribute目录,编译库、二进制文件等。为分配到其他机器所需。
速度:为了快速的生成,通过运行make all –j8并行编译,其中8是并行编译线程的数量(线程数量最好选择机器内核的数量)。
安装好caffe后,检查mnist教程和imagenet模型教程。
cmake编译
在手动编辑makefile.config的地方配置编译文件,caffe提供一个非官方的cmake编译,感谢一些社区成员。需要cmake版本>=2.8.7。基本步骤如下所示:
python
1
2
3
4
5
6 mkdirbuild
cdbuild
cmake..
makeall
makeinstall
makeruntest
imagenet训练网络
这个教程是为了让你准备好使用自己的数据训练自己的模型。如果你想要一个imagenet训练网络,那么请注意训练会消耗大量的能源,而我们讨厌全球变暖,所以我们提供caffenet模型作为下面model zoo中的训练模型。
数据准备
本文指出所有的路径,并假设所有的命令在caffe根目录执行。
imagenet,我们这里的意思是ilsvrc12挑战赛,但是你可以轻松训练整个imagenet,只是需要更多的磁盘控件和稍微多一点的训练时间。
我们假设你已经下载了imagenet训练数据和验证数据,它们存储在你的磁盘中如下位置:
python
1
2 /path/to/imagenet/train/n01440764/n01440764_10026.jpeg
/path/to/imagenet/val/ilsvrc2012_val_00000001.jpeg
首先,你需要准备一些用于训练的辅助数据。这些数据可以这样下载。
python
1 ./data/ilsvrc12/get_ilsvrc_aux.sh
训练和验证输入数据分别为train.txt和val.txt,使用文本文件列出所有文件和它们的标签。注意我们对标签使用同ilsvrc devkit不同的索引:我们按照ascii码排序这些同义词组的名字,从0到999标记它们。在synset_works.txt中查看同义词组和名字的映射。
你可能想要预先调整图像的大小为256*256。默认情况下,我们不需要显示的做这个,因为在集群环境中,一个好处是可以并行调整图像大小,并使用分布式编程环境。例如,yangqing使用他的轻量级mincepie包。如果你想要事情更简单,你也可以像这样使用shell命令:
python
1
2
3 fornamein/path/to/imagenet/val/*.jpeg;do
convert-resize256x256\!$name$name
done
看一下examples/imagenet/create_imagenet.sh。根据需要设置路径为训练和验证目录,同时设置“resize=true”调整所有图像的大小为256*256,如果你没有提前调整图像。现在只使用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和登录,如果你不熟悉它们的话。总之,平均值计算可以这样做:
python
1 ./examples/imagenet/make_imagenet_mean.sh
结果会生成data/ilsvrc12/imagenet_mean.binaryproto.
模型定义
我们将描述krizhevsky、sutskever和hinton在nips 2012的文章中第一次提出这个方法的参考实例。
网络定义(models/bvlc_reference_caffenet/train_val.prototxt)遵循krizhevsky等人的定义。注意,如果偏离了本文建议的文件路径,你需要在.prototxt文件中调整相关路径。
如果你认真看了models/bvlc_reference_caffenet/train_val.prototxt,你会注意到几个指定phase: train或phase: test的include部分。这部分允许我们在一个文件中定义两个非常相关的网络:一个网络用于训练,另一个网络用于测试。这两个网络几乎是相同的,分享所有的层,除了那些标记为include { phase: train } 或 include { phase: test }的层。在这种情况下,只有输入层和一个输出层是不同的。
输入层的不同:训练网络数据的输入层从examples/imagenet/ilsvrc12_train_leveldb中提取数据,随机的映射到输入图像。测试网络的数据层从examples/imagenet/ilsvrc12_val_leveldb中获得数据,不执行随机映射。
输出层的不同:两个网络都输出softmax_loss层,它在训练网络中用于计算损失函数,并初始化反向传播算法,而在验证过程只是简单的报告这个损失。测试网络还有第二个输出层,accuracy,它用于报告测试集的准确度。在训练过程,测试网络偶尔在测试集上被实例化并测试,产生代码行如test score #0: xxx 和 test score #1: xxx。在这里score0是准确度(对于未训练的网络将从1/1000=0.001开始),score1是损失(对于未训练的网络将从7附近开始)。
我们也将设计一个协议缓存用于运行求解。让我们做几个计划:
我们将以256个为一组,运行总共450000次迭代(大约90个最大训练次数)。
每1000次迭代,我们使用验证数据测试学习网络。
我们设置初始学习速率为0.01,每100000次迭代后减小它(大概20个最大训练次数)。
每20个迭代显示一次信息。
这个训练网络的动量为0.9,权重衰减为0.0005.
每10000次迭代,我们会简要说明当前状态。
听起来不错吧?这是在models/bvlc_reference_caffenet/solver.prototxt.中完成的。
训练imagenet
准备好了吗?我们开始训练。
python
1 ./build/tools/caffetrain--solver=models/bvlc_reference_caffenet/solver.prototxt
在一个k40机器上,每20次迭代大概需要运行26.5秒(在k20上为36秒),所以实际上每幅图像完成完全前后向移动采集数据为5.2ms。大概2ms向前,其余时间向后。如果你对仔细分析计算时间感兴趣,你可以运行
python
1 ./build/tools/caffetime--model=models/bvlc_reference_caffenet/train_val.prototxt
继续训练?
我们都经历过停电,或者我们想要稍微奖励自己一下,玩一会儿battlefield(还有人记得quake吗?)。因为我们在训练时截取中间结果,所以我们可以从截图位置继续训练。这可以很容易的完成,像这样:
python
1
2 ./build/tools/caffetrain--solver=models/bvlc_reference_caffenet/solver.prototxt—
snapshot=models/bvlc_reference_caffenet/caffenet_train_iter_10000.solverstate
其中脚本caffenet_train_iter_10000.solverstate是存储所有所需信息的求解状态简介,可以用来恢复为准确的求解状态(包括参数、动量历史等)。
结语
因为你有了已训练网络,查看怎样使用python接口分类图像。
分类imagenet:使用c++接口
caffe,它的内核是用c++写的。可以使用caffe的c++接口去完成类似上个例子中python代码展示的图像分类应用。为了查看caffe c++ api更通用的示例,你应该学习tools/caffe.cpp中的命令行工具caffe的源代码。
介绍
文件examples/cpp_classification/classification.cpp给出了简单的c++代码。为了简单起见,这个例子不支持单一样本过采样,也不支持多个独立样本的批处理。这个例子不是试图达到系统吞吐量的最大可能分类,而是特别注意在保持代码可读性的同时避免不必要的劣化。
编译
这个c++示例是在编译caffe时自动生成。遵循文档说明编译caffe,在build目录中这个分类示例被生成为examples/classification.bin。
用途
想要使用预先训练的caffenet模型分类示例,需要先从“model zoo”中下载。使用脚本:
python
1 ./scripts/download_model_binary.pymodels/bvlc_reference_caffenet
imagenet标签文件(也叫同义词组文件)也是需要的,用于将预测类别映射到类别名:
c++
1 ./data/ilsvrc12/get_ilsvrc_aux.sh
使用这些下载的文件,我们可以分类预先准备的猫图像(examples/images/cat.jpg),使用命令:
c++
1
2
3
4
5
6 ./build/examples/cpp_classification/classification.bin\
models/bvlc_reference_caffenet/deploy.prototxt\
models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel\
data/ilsvrc12/imagenet_mean.binaryproto\
data/ilsvrc12/synset_words.txt\
examples/images/cat.jpg
输出应该是:
c++
1
2
3
4
5
6
7
8
9
10
11 ----------predictionforexamples/images/cat.jpg----------
0.3134-n02123045 tabby, tabby cat
0.2380-n02123159 tiger cat
0.1235-n02124075 egyptian cat
0.1003-n02119022 red fox, vulpes vulpes
0.0715-n02127052 lynx, catamount
提高性能
为了进一步提高性能,你需要更多的利用gpu,这里是一些准则:
尽早将数据转移到gpu上,在这里完成所有的预处理操作。
如果你同时分类许多图像,应该使用批处理(许多独立图像在一次运行中被分类)。
使用多线程分类确保gpu被充分利用,不要等待i/o阻塞cpu线程。

2010年中国PCB产业前景良好 但暗含不少问题
专访华为董事徐文伟:让科学回归科学 拒绝太多地域和政治属性
印尼电池级镍厂项目的环境影响评价报告有望今年年底出炉
热度不弱于小米6,小编觉得OPPOR11这次真算很厚道了!
怎样将MAX7219驱动的LED矩阵8x8与ATtiny85微控制器连接
深度学习的框架Caffe使用详情
自动驾驶检测器可同时实现3D检测精读和速度的提升
仿生生物嗅觉传感器研究进展
美国航天局的“毅力号探测器”顺利踏上火星
小米发布新品MIX Alpha,其想象空间无限
电缆故障测试仪之故障原因的详细分析
LED灯的各种连接形式及特点介绍
IIC-China 2010参展商展前专访:世纪民生
苹果迎来iOS11.3正式版 iPhone 8 Plus/iPhone X已哭晕
MAX5215,MAX5217低功耗数模转换器
截止2019年3月全球5G专利中国占比高达34%
600万死难者记忆由AI守护!
研究人员开发新算法,可改善自动驾驶系统性能
魅族Pro7最新消息,魅族Pro7晚上七点半正式上线,深度处理的联发科,煤油们是否买单?
人工智能和物联网是什么关系