2. Caffe依赖包解析

来源:互联网 发布:淘宝大卖家如何放单 编辑:程序博客网 时间:2024/05/29 12:25

2.1 ProtoBuffer

  ProtoBuffer是由 google 开发的一种可以实现内存与非易失性存储介质(如硬盘文件)交换的协议接口。Caffe 源码中大量使用了 Protobuffer 作为权值和模型参数的载体。
  ProtoBuffer 工具完美地解决了“不一致的参数管理”这个问题,用户只需建立统一的参数描述文件(proto),然后利用 proto 编译就能让协议细节等关键部分代码自动生成,节省了大量的开发、调试时间。
使用 ProtoBuffer 还可以跨语言(C++/Java/Python)传递相同的数据结构。

  solver.prototxt 文件中记录了一些模型训练所需的超参数(Hyper-Parameter),用 Caffe 训练时会首先读取该文件,获得其中特定字段的数值,并据此设置内存中模型训练时的超参数设置值,从文件读取到内存的过程就是由 ProtoBuffer 工具协助完成。
  caffe.pb.h 和 caffe.pb.cc 就是用于解析 Caffe 参数配置文件、将模型权值序列化/反序列化到磁盘的协议接口。

2.2 Boost

  Caffe 中主要使用了 Boost 中的智能指针,其自带引用计数功能,可避免共享指针时造成内存泄漏或多次释放。
  另外,pycaffe 使用 Boost Python 实现 C/C++ 和 Python 语言的连接,方便 Python 调用 C/C++ 设计的模块。

2.3 GFLAGS

  GFLAGS 在 caffe 中主要起到命令行参数解析的作用,这与 ProtoBuffer 功能类似,只是参数源不同。GFLAGS 的使用方法可参考 Caffe 源码中的 tools/caffe.cpp。

2.4 GLOG

  GLOG库是 Google 开发的用于记录应用程序日志的使用库,提供基于 C++ 标准输入输出流形式的接口,记录时可选择不同的日志级别,方便将重要日志和普通日志分开。

  GLOG 在 Caffe 中主要起到记录日志的作用,便于开发者查看 Caffe 训练中产生的中间输出,并根据这些信息决定如何调整参数来控制收敛。从日志文件我们能非常方便地看到程序运行的流程,便于跟踪源码、定位问题。GLOG 的使用方法可参考 Caffe 源码中的 tools/caffe.cpp。

2.5 BLAS

  卷积神经网络中用到的数学计算主要是矩阵、向量的计算, Caffe 中调用了 BLAS(Basic Linear Algebra Subprograms,基本线性代数子程序)中的相应方法。最常用的 BLAS 实现有 Intel MKL、ATLAS、OpenBLAS 等,Caffe 可以选择其中任一种。
  OpenBLAS 在 Caffe 中主要负责 CPU 端的数值计算(如矩阵乘法)。由于调用量相当大,该库的性能直接影响 Caffe 的运行性能。

2.6 HDF5

  HDF(Hierarchical Data File)是美国国家高级计算应用中心(NCSA)为了满足各种领域研究需求而研制的一种能高效存储和分发科学数据的新型数据格式。它可以存储不同类型的图像和数码数据的文件,并且可以在不同类型的机器上传输,同时还有统一处理各种文件格式的函数库。
Caffe 训练模型可以选择保存为 HDF5 格式或(默认的) ProtoBuffer 格式。

2.7 OpenCV

  Caffe 里面用到的 OpenCV 模块非常有限,仅限于图片读写、图片缩放等 CPU 上的莫块。

2.8 LMDB 和 LEVELDB

  LMDB,闪电般的内存映射型数据库管理器,在 Caffe 中的作用主要是提供数据管理,将形形色色的原始数据(JPEG 图片、二进制数据)转换为统一的 Key-Value 存储,便于 Caffe 的 DataLayer 获取这些数据。
  LEVELDB 库是 Caffe 早期版本使用的数据存储方式,也是持续的数值对存储方式,键和值可以为任意字节数组,键的存储顺序可由用户定义的比较函数决定。

2.9 Snappy

  Snappy 是一个用于压缩和解压的 C++ 库,旨在提供较高的压缩速度和合理的压缩率。Snappy 比 alib 更快,但文件相对要大 20% ~ 100%。

参考《深度学习—21天实战caffe》