Caffe源码解读前言

来源:互联网 发布:企业级网络交换机 编辑:程序博客网 时间:2024/05/17 08:16

Caffe源码解读前言

Caffe是一款优秀的深度学习框架,相信学习深度学习的同学也都多多少少接触过这个框架。虽然Caffe使用起来非常简单,似乎不需要读懂里面的代码也可以轻松对数据库进行训练,但是一款好的框架不仅仅是使用上的方便,更重要的在于他的扩展性,如果要对caffe进行自定义的扩展,则需要对caffe的代码非常熟悉。
Caffe的代码整体上可读性很好,架构比较清晰,下面我们来看看caffe的基本实现框架。

caffe结构

图片引用自这里

从上图可以很清楚的看出caffe的框架结构,下面我们来分析里面比较重要的类。

Blob:Blob是caffe中处理和传递数据的数据封装包,并且在cpu和gpu之间具有同步处理能力(使用SyncedMem)。我们可以把Blob看成是c风格连续储存的N维数组。每一个Blob中都有data和diff两个数据指针,data用于存储前向传播的数据,diff用于存储反向传播的梯度。

SyncedMem:这个类主要是用来进行cpu和gpu数据的同步操作。caffe支持cuda,所以在编程中,我们的数据很可能在cpu和gpu之间相互流动,SyncedMem把CPU/GPU数据操作封装起来,我们只需要调用接口就可以进行同步数据。

Layer:Layer是caffe执行计算的基本单元。举个例子,在cnn中我们需要对图像进行卷积、池化、内积等操作,而这些操作则在Layer类中定义(Layer类是基类,实现了最基本的操作,具体的操作如卷积操作则是继承Layer类的子类实现)。

Net:Net将数据和层组合起来进行封装,对外暴露了初始化和前后向的接口,使得整体看上去和一个层的功能类似,但内部的组合可以是多种多样。一个典型的Net如下图所示(矩形表示Layer,六边形表示Blob)。

Net简单定义

Solver:有了net之后我们就可以自己构造自己需要的深度学习网络,并且可以进行前向和反向传播了,但是关于网络的学习训练的功能还有些缺乏。solver通过协调net的前向和反向计算来对参数进行更新,从而达到减小loss的目的。它还开放了两类接口:一个是更新参数的接口,继承Solver可以实现不同的参数更新方法,如大家喜闻乐见的Momentum,Nesterov,Adagrad等。这样使得不同的优化算法能够应用其中。另外一个是训练过程中每一轮特定状态下的可注入的一些回调函数,在代码中这个回调点的直接使用者就是多卡训练算法。

前面我们介绍了caffe中最基本也是最重要的类,接下来的博客中将去重点关注这些类的实现细节,博客写的顺序也是按照上述的顺序写。

本人使用的是微软提供的caffe,配置起来简单粗暴。
下载点这里
不清楚怎么配置的可以看这里

0 0
原创粉丝点击