您的位置:首页 > 运维架构 > 网站架构

caffe 的架构设计及其依赖包的解析

2016-11-05 22:48 253 查看
Caffe | Deep Learning Framework

Web Classification Demos

caffe(全称,Convolution Architecture For Feature Extraction) 的安装之所以困难,在于其依赖了大量的第三方开源库:

为了读取图像,以及简单的图像处理(拉伸,颜色变化),链接很重的 OpenCV 库

boost(未来会成为 C++ 的标准,就像STL) 来实现一些 C++11 的特征

HD5/LMDB/LEVELDB 用来做数据 IO(训练集)

避免大量的碎片文件,ImageNet有几百万张图像,(128k的小文件)

仅仅是 DB,还不是关系型

ProtoBuffer(google) 的使用随处可见

引入 Protocol buffer 技术,省去编写大量描述性(描述的性质,并不代表可编程性)的 C++ 代码,比如配置参数,属性变量等;

这些可以被 protobuffer 的编译器自动地生成 .h 文件和 .cc 文件(在同一个文件夹下)

方便序列化,用户可以直接阅读 prototxt 文件,来了解网络结构;

当然这些如果是放在 Linux 平台下进行安转的话,安装是十分简单的。

1. Caffe 的基本架构

caffe(torch) 是基于层(前向和后向)的设计思路:

Blob 模块,实现了 Tensor(张量,可以通俗地理解为多维矩阵的意思) 的功能,保存数量和梯度值,其具有 4 个维度,分别是:

number,chanel,height,width

Layer 模块,根据输入(bottom)blob 计算输出 (top)blob,同时保存权重/梯度(神经网络,从图的观点其实代表着DAG,有向无环图),

Net 模块:由多个 layer 组成,实现 forward/backward 计算;

从 UML 的关系考虑 Layer 类和 Net 的关系,应当类似于:汽车(Net)与轮胎(Layer),是一种聚合的关系(aggregation)

C++基础——用C++实例理解UML类图

Solver 模块, 最优化模块,利用梯度值更新权重,

2. caffe 的训练方式

需要提前准备数据,保存为 LMDB/LevelDB 等格式(编写脚本);

不需编写 C++ 代码,直接编写 .prototxt 定义 Net 对象;

直接编写 .prototxt 定义 solver 对象;(用于训练)

通过参数直接执行 caffe 命令进行训练;

3. 依赖包

ProtoBuffer:由 caffe 定义的模型,都需要有一个
solver.prototxt
文件,其中记录了模型训练所需要的超参,用 caffe 训练时会首先读取该文件,获得其中特定字段的数值,并据此设置内存中模型训练时的超参数变量值;

using google::protobuf::io::FileInputStream;

const char* filename = "solver.prototxt";
int fid = open(filename, O_RDONLY);
FileInputStream* input = new FileInputStream(fid);

caffe::SolverParam solver_param;

google::protobuf::TextFormat::Parse(input, &solver_param);


BLAS:卷积神经网络中用到的数学计算主要是矩阵向量的运算,caffe 中调用了 BLAS(Basic Linear Algebra Subprograms,基本线性代数子程序)中的相应方法,最常用的 BLAS 实现主要有以下几种:

Intel MKL

ATLAS

OpenBLAS

caffe 可以选择其中其中任意一种,通过对 Makefile.config 编译文件的配置。Makefile.config 配置文件关于 BLAS 的设置如下所示:

# BLAS choice:
# atlas for ATLAS (default)
# mkl for MKL
# open for OpenBlas
BLAS := atlas
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: