0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

tUM2_ADA 来源:djl 作者:ADAS 2019-08-09 08:59 次阅读

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线程。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 多媒体
    +关注

    关注

    0

    文章

    494

    浏览量

    36921
  • C++
    C++
    +关注

    关注

    21

    文章

    2098

    浏览量

    73452
  • 深度学习
    +关注

    关注

    73

    文章

    5463

    浏览量

    120876
收藏 人收藏

    评论

    相关推荐

    Nanopi深度学习之路(1)深度学习框架分析

    就能实现!还请关注我后面的日记。实际上我也是刚刚有时间学习深度学习,我是个纯初学者,但面对深度学习里的各种复杂理论和公式推导,自己实现个小功
    发表于 06-04 22:32

    【NanoPi K1 Plus试用体验】搭建深度学习框架

    近几年各种深度学习框架涌现,大家可能很难从众多的深度学习框架中选择一个合适的
    发表于 07-17 11:40

    Mali GPU支持tensorflow或者caffe深度学习模型吗

    Mali GPU 支持tensorflow或者caffe深度学习模型吗? 好像caffe2go和tensorflow lit可以部署到ARM,但不知道是否支持在GPU运行?我希望把训
    发表于 09-16 14:13

    TensorFlow实战之深度学习框架的对比

    的热潮持续高涨,各种开源深度学习框架也层出不穷,其中包括TensorFlow、Caffe、Keras、CNTK、Torch7、MXNet、Leaf、Theano、DeepLearnin
    发表于 11-16 11:52 4545次阅读
    TensorFlow实战之<b class='flag-5'>深度</b><b class='flag-5'>学习</b><b class='flag-5'>框架</b>的对比

    深度学习框架Keras代码解析

    总体来讲keras这个深度学习框架真的很“简易”,它体现在可参考的文档写的比较详细,不像caffe,装完以后都得靠技术博客,keras有它自己的官方文档(不过是英文的),这给初学者提供
    发表于 12-15 08:22 4501次阅读

    为什么选择Caffe深度学习框架Caffe的安装和程序概述

    Caffe是一个深度学习框架,具有表达力强、速度快和模块化的思想,由伯克利视觉学习中心(BVLC)和社区贡献
    的头像 发表于 04-29 16:23 4195次阅读
    为什么选择<b class='flag-5'>Caffe</b><b class='flag-5'>深度</b><b class='flag-5'>学习</b><b class='flag-5'>框架</b><b class='flag-5'>Caffe</b>的安装和程序概述

    浪潮在美国发布深度学习计算框架Caffe

    4月6日消息(美国硅谷当地时间4月5日)今日,在2016年GPU全球技术大会(GTC16)上,浪潮开源发布深度学习计算框架Caffe-MPI。同时,浪潮还表示将设立
    发表于 05-18 18:03 1544次阅读

    Xeon PHI集群深度学习框架Caffe和Tensorflow的性能优化

    In this talk, we analyze the performance characteristics of Caffe* and TensorFlow* on an Intel® Xeon Phi™ processor x200.
    的头像 发表于 10-19 07:30 2587次阅读

    八种主流深度学习框架的介绍

    导读:近几年随着深度学习算法的发展,出现了许多深度学习框架。这些框架各有所长,各具特色。常用的开
    的头像 发表于 04-26 18:45 8348次阅读

    深度学习框架是什么?深度学习框架有哪些?

    深度学习框架是什么?深度学习框架有哪些?  深度
    的头像 发表于 08-17 16:03 2639次阅读

    深度学习框架的作用是什么

    深度学习框架的作用是什么 深度学习是一种计算机技术,它利用人工神经网络来模拟人类的学习过程。由于
    的头像 发表于 08-17 16:10 1507次阅读

    深度学习算法库框架学习

    深度学习算法库框架学习 深度学习是一种非常强大的机器学习
    的头像 发表于 08-17 16:11 646次阅读

    深度学习框架连接技术

    深度学习框架连接技术 深度学习框架是一个能够帮助机器学习
    的头像 发表于 08-17 16:11 739次阅读

    深度学习cntk框架介绍

    深度学习cntk框架介绍  深度学习是最近几年来非常热门的话题,它正在彻底改变我们生活和工作的方式。随着越来越多的创新和发展,人工智能和机器
    的头像 发表于 08-17 16:11 1293次阅读

    深度学习框架深度学习算法教程

    深度学习框架深度学习算法教程 深度学习是机器
    的头像 发表于 08-17 16:11 1030次阅读