Caffe依赖包解析

  • ProtoBuffer
    ProtoBuffer是用来实现内存与非易失存储介质(如硬盘文件)交换的协议接口,可以跨语言(C++/Java/Python)传递相同的数据结构,使团队协作更有效率。Caffe中大量使用ProtoBuffer作为权值和模型参数的载体,用户只需要建立统一的参数描述文件(proto),然后利用protoc编译就能让协议细节等关键部分代码自动生成。
    用Caffe训练时会首先读取后缀名为.prototxt文件(包含所需要的超参数,Hyper-Parameter),获得其中特定字段的数值,并据此设置内存中模型训练时的超参数变量值。
    caffe.proto中的sovlerParameter协议、caffe.bp.cc和caffe.bp.h可了解ProtoBuffer自动完成复杂接口的详细细节。

  • Boost
    Boost中包含字符串处理、正则表达式、容器和数据结构、并发编程、函数式编程、泛型编程、设计模式实现等。
    Caffe主要使用Boost中的智能指针,其自带引用计数功能,可避免共享指针时造成内存泄露或多次释放。pycaffe使用Boost Python实现C/C++和Python语言的连接,方便Python调用C/C++设计的模块。

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

  • GLOG
    GLOG库是Google开发用来记录应用程序日志的库程序,提供基于C++标准输入输出流形式的接口,记录时可选择不同的日志级别,方便将重要日志和普通日志分开。
    在Caffe中主要起到记录日志的作用,便于开发者查看Caffe训练中产生的中间输出,并根据这些信息决定如何调整参数来控制收敛。从日志文件中能非常方便地查看程序运行的流程,便于跟踪源码、定位问题,其使用方法参考Caffe源码中的tools/caffe.cpp

  • BLAS
    Caffe中调用BLAS(Basic Linear Algebra Subprograms,基本线性代数子程序 )中相应的方法,最常用的BLAS实现有Intel MKL、ATLAS、OpenBLAS等,Caffe可选择其中的任何一种,在Makefile.config中修改。
    OpenBLAS在Caffe中主要负责CPU端的数值计算(如矩阵乘法)。在GPU端的数值计算则由对应的cuBLAS完成,其API接口与OpenBLAS类似。
    在include/caffe/util/math_functions.hpp中

    template <typename Dtype> 
    void caffe_cpu_gemm(const CBLAS_TRANSPOSE TransA,
                        const CBLAS_TRANSPOSE TransB,
                        const int M, const int N,const int K,
                        const Dtype alpha, 
                        const Dtype* A, const Dtype* B, 
                        const Dtype beta,
                        Dtype* C);

    gemm表示基本矩阵-矩阵乘积运算,实现C=alpha*op(A)*op(B)+beta*C。 其中CBLAS_TRANSPOSE是一个枚举常量,在/home/yourname/local_install/cblas.h中定义:

    typedef enum CBLAS_TRANSPOSE { CblasNoTrans = 111,
                                   CblasTrans = 112,
                                   CblasConjTrans = 113,
                                   CblasConjNoTrans = 114
                                  } CBLAS_TRANSPOSE;

    TransA取值实现四种:{原矩阵,转置矩阵,共轭转置矩阵,共轭矩阵}。 Caffe中重新包装了OpenBLAS的dgemm、sgemm函数,简化了设置,减轻了算法实现负担。

    template <typename Dtype> 
    void caffe_cpu_gemv(const CBLAS_TRANSPOSE TransA,
                        const int M, const int N,
                        const Dtype alpha, const Dtype* A, const Dtype* x, 
                        const Dtype beta, Dtype* y); 

    gemv表示基本矩阵-向量乘积运算,实现C=alpha*op(A)*x+beta*y。

  • HDF5
    HDF为了满足各种领域研究需求而研制的一种高效存储和分布科学数据的新型数据格式,可以存储不同类型的图像和数码数据的文件,并可以在不同类型的机器上传输,同时还有统一处理这种文件格式的函数库。
    Caffe训练模型可以选择保存为HDF5格式(默认)或者ProtoBuffer格式。

  • Opencv
    Opencv是开源计算机视觉库,包含大量图像处理函数。
    Caffe使用Opencv完成一些图像存取和预处理功能。Caffe里面用到Opencv模块非常有限,仅限于图片读写、图片缩放等CPU上的模块,完全可以禁用无关模块。
    OpenCV的使用方法可以参考Caffe源码中io.hpp和io.cpp。

  • LMDB和LEVELDB
    LMDB(Lightning Memory-Mapped Database Manager)闪电般的内存映射型数据库管理器,在Caffe中的作用主要提供数据管理,将形形色色的原始数据转换为统一的Key-Value存储,便于Caffe的DataLayer获取这些数据。
    LEVELDB库是Caffe早期版本中使用的数据存储方式,是一种持续的键值对存储方式,键和值可以为任意字节数组,键的存储顺序可以由用户定义的比较函数完成。
    LMDB和LEVELDB使用方法可参考Caffe源码中的db_lmdb.hpp、db_lmdb.cpp、db_leveldb.hpp和db_leveldb.cpp。

  • Snappy
    Snappy是一个压缩和解压的C++库,旨在提供较高的压缩速度和合理的压缩率,比zlib更快。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值