文章作者:Tyan
博客:noahsnail.com | CSDN |
Caffe是一个开源的深度学习框架,其实现依赖于许多其它的库,下面将分别介绍Caffe所需的依赖库。
1. OpenCV
OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。
2. Boost
Boost C++库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,在C++社区中影响甚大。 Boost库为我们带来了最新、最酷、最实用的技术,是不折不扣的“准”标准库。Boost作为一个准标准库,相当于STL的延续和扩充,它的设计理念和STL比较接近,都是利用泛型让复用达到最大化。不过相比于STL,Boost更加实用。STL集中在算法部分,而Boost包含了不少工具类,可以完成比较具体的工作。Boost主要包含以下几个大类:字符串及文本处理、容器、迭代器(Iterator)、算法、函数对象和高阶编程、泛型编程、模板元编程、预处理元编程、并发编程、数学相关、纠错和测试、数据结构、输入/输出、跨语言支持、内存相关、语法分析、杂项。
3. CUDA
CUDA(Compute Unified Device Architecture,统一计算架构)是由NVIDIA所推出的一种集成技术,是NVIDIA推出的运算平台。CUDA是由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。从CUDA体系结构的组成来说,包含了三个部分:开发库、运行期环境和驱动。开发库是基于CUDA技术所提供的应用开发库。运行期环境提供了应用开发接口和运行期组件,包括基本数据类型的定义和各类计算、类型转换、内存管理、设备访问和执行调度等函数。驱动部分基本上可以理解为是CUDA-enable的GPU的设备抽象层,提供硬件设备的抽象访问接口。CUDA提供运行期环境也是通过这一层来实现各种功能的。
4. BLAS
BLAS(Basic Linear Algebra Subprograms,基础线性代数程序集)是一个应用程序接口(API)标准,用以规范发布基础线性代数操作的数值库(如矢量或矩阵乘法)。在高性能计算领域,BLAS被广泛使用。Caffe推荐的BLAS(Basic Linear Algebra Subprograms)有三个选择ATLAS,Intel MKL,OpenBLAS。其中ATLAS是caffe是默认选择的,其开源免费,如果没有安装CUDA的不太推荐使用,因为对CPU多线程的支持不太好;Intel MKL是商业库要收费,学生可申请试用,贾扬清安装的是MKL,估计效果应该是最好的;OpenBLAS开源免费,支持CPU多线程。
5. LevelDB
LevelDB是一个由Google公司所研发的键/值对(Key/Value Pair)嵌入式数据库管理系统编程库,以开源的BSD许可证发布,是Caffe支持的数据格式之一。LevelDb有如下一些特点:
首先,LevelDb是一个持久化存储的KV系统,和Redis这种内存型的KV系统不同,LevelDb不会像Redis一样狂吃内存,而是将大部分数据存储到磁盘上。
其次,LevleDb在存储数据时,是根据记录的key值有序存储的,就是说相邻的key值在存储文件中是依次顺序存储的,而应用可以自定义key大小比较函数,LevleDb会按照用户定义的比较函数依序存储这些记录。
再次,像大多数KV系统一样,LevelDb的操作接口很简单,基本操作包括写记录,读记录以及删除记录。也支持针对多条操作的原子批量操作。
另外,LevelDb支持数据快照(snapshot)功能,使得读取操作不受写操作影响,可以在读操作过程中始终看到一致的数据。
6. LMDB
LMDB是一种小型的键值对数据库,具有一些非常优异的特性:
有序的映射接口(键一直是按字典排序的)
读写事务:读不会锁住写,写也不会锁住读
读取数据代价很低
内存映射,允许零拷贝查找和迭代
维护不需要外部进程或后台线程
虽然LMDB的内存消耗是LevelDB的1.1倍,但是LMDB的速度比LevelDB快10%至15%,更重要的是LMDB允许多种训练模型同时读取同一组数据集。因此LMDB取代了LevelDB成为Caffe默认的数据集生成格式。
7. GLog
Google的Glog是一个应用程序的日志库。它提供基于C++风格的流的日志API,以及各种辅助的宏。打印日志只需以流的形式传给 LOG(level) 。
8. GFlags
GFlags是Google的一个开源的处理命令行参数的库,使用C++开发,具备Python接口,可以替代getopt。GFlags使用起来比getopt方便,但是不支持参数的简写。
9. Protobuff
Google Protocol Buffer(简称Protobuf) 是Google公司内部的混合语言数据标准,它提供了一种灵活、高效、自动序列化结构数据的机制,但是比XML更小、更快、更简单。仅需要自定义一次你所需的数据格式,然后用户就可以使用Protobuf编译器自动生成各种语言的源码,方便的读写用户自定义的格式化的数据。与语言无关,与平台无关,还可以在不破坏原数据格式的基础上,依据老的数据格式,更新现有的数据格式。它们用于RPC 系统和持续数据存储系统。Protobuf是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或RPC数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了C++、Java、Python三种语言的API。
10. HDF5
HDF(英语:Hierarchical Data Format)指一种为存储和处理大容量科学数据设计的文件格式及相应库文件。HDF最早由NCSA开发,目前在非盈利组织HDF小组维护下继续发展。当前流行的版本是HDF5。
HDF5文件包含两种基本数据对象:
群组(group):类似文件夹,可以包含多个数据集或下级群组。
数据集(dataset):数据内容,可以是多维数组,也可以是更复杂的数据类型。
群组和数据集都支持元数据,用户可以自定义其属性,提供附加信息。HDF现在被众多商业与非商业平台支持,包括Java,MATLAB/Scilab,Octave,IDL,Python和R。
11. Snappy
Snappy(以前称Zippy)是Google基于LZ77的思路用C++语言编写的快速数据压缩与解压程序库,并在2011年开源。它的目标并非最大压缩率或与其他压缩程序库的兼容性,而是非常高的速度和合理的压缩率。LevelDB需要Snappy的支持。