《caffe网络结构几个部分简单介绍》由会员分享,可在线阅读,更多相关《caffe网络结构几个部分简单介绍(4页珍藏版)》请在金锄头文库上搜索。
1、卞面这个复制于一片知乎首先应该了解下几个大的炎,比如blob,net, layer, solver,然后看怎么从 proto文件中初始化创建网络,blob, layer, net这儿层关系中数据是如何传递 的。至于不同的layer,用到那种layer的吋候再看就ok。1. 初识 Caffe1.1. Caffe相对与其他DL框架的优点和缺点:优点:速度快。Google Protocol Buffer数据标准为Caffe提升了效率。学水论文采用此模型较多。不确定是不是最多,但接触到的不少论文都与Caffe有 关(R-CNN,DSN,最近还有人用Caffe实现LSTM)缺点:曾更新过S要函数接口。有
2、人反映,偶尔会出现接U变换的情况,自己很久前写的 代码对能过了一段时间就不能和新版本很好地兼容了。(现在更新速度放缓,接口 逐少趋于稳定,感谢评论区王峰的建议)对于某些研究方向来说的人并不适合。这个需要对Caffe的结构冇一定了解,(盾 面提到)。1.2. Caffe代码层次。回答里面有人说熟悉Blob,Layer, Net, Sol ver这样的几大秃,我比较赞同。 我基本是从这个顺序开始学习的,这四个类复杂性从低到高,贯穿了整个Caffeo 把他们分为三个层次介绍。Blob:是基础的数据结构,是用來保存学AI到的参数以及网络传输过程中产牛.数据 的类。Layer:是网络的基木单元,由此派生
3、出了各种层:类。修改这部分的人主要是研究特 征表达方向的。Net:是网络的搭建,将Layer所派生出层类组合成网络。Solver:是Net的求解, 修改这部分人主要会是研究DL求解方向的。2. Caffe 进阶2. 1. Blob:Caffe支持CUDA,在数据级别上也做了一些优化,这部分最重要的是知道它主要 是对protocol buffer所定义的数据结构的继承,Caffe也因此可以在尽可能小 的内存占用下获得很高的效率。(追求性能的同时Caffe也牺牲了-些代码可读 性)在更高一级的Layer中Blob用下而的形式表示学习到的参数:vectorshared_ptrBlob blobs 这
4、里使用的是一个Blob的容器是因为某些Layer包含多组学习参数,比如多个 卷积核的卷积层。以及Layer所传递的数据形式,后面还会涉及到这里:vectorBlob* Scbottom;vectorBlob* *top2. 2. Layer:2. 2. 1. 5大Layer派生类型Caffe十分强调网络的层次性,也就是说卷积操作,非线性变换(ReLU等), Pooling,权值选接等全部都由某一种Layer来表承。具体来说分为5大笑LayerNeuronLayer类定义于neuronjayers.hpp中,其派生类主要是元素级别的运算(比 如Dropout运算,激活函数ReLu,Sigmoid
5、等),运算均为同址计算(in-place computation,返回值覆盖原值而用新的内存)。LossLayer类定义于lossjayers.hpp中,其派生戈会产生loss,只行这些W能够产 zl: lOSSo数据层定义于datajayer.hpp巾,作为网络的最底层,主要实现数裾格式的转换。特征表达层(我自己分的类)定义于visionjayers.hpp (力什么叫vision这个名字, 我目前还不淸楚),变现特征表达功能,更具体地说乜含卷积操作,Pooling操作, 他们菽木都会产生新的内存心用(Pooling相对较小)。网络连接层和激活函数(我自己分的类)定义于commonjayer
6、s.hpp,Caffe提供了 甲个多个U的连接,并在这个头文件中声明。这里还包括/常用的全连接层 Inn erProd uc tLay er 类。Layer的重要成员函数在Layer内部,数据主要有W种传递方式,正向传导(Forward)和反向传导 (Backward) o Forward 和 Backward 有 CPU 和 GPU (部分有)W种实现。Caffe中所有的Uyer都要用这两种方法传递数据。virtual void Forward(const vcctorBlob* &bottom,vectorBlob* 氺top) = 0;virtual voidBackward(const
7、 vectorBlobDtype氺&top,const vector fepropagatedown, vectorBlob* bottom) = 0;Layer类派生出来的M类通过这实现这两个虚函数,产生了各式各样功能的M 类。Forward是从根据bottom计算top的过程,Backward则相反(根据top计 算bottom)。注意这里为什么用了一个含Blob的容器(vector),对于大多 数Layer来说输入和输出都各连接有一个Layer,然而对于某些Layer存在一 对多的情况,比如LossLayer和來些连接层。在网路结构定义文件(*. proto) 中每一M的参数bottom
8、和top数目就决定了 vector中元素数目。layers bottom: decodelneuron / 该层底下连接的第一个 Layer bottom: flatdata/该层底下连接的第二个Layertop: 12_error/该层顶上连接的一个Layername: loss/该足的名字type: EUCLIDEAN_LOSS / 该M的类型 loss_weight: 0Layer的重要成员变量lossvector loss每一M又存一个lossjfi,只不多大多数Layer都是0,只育LossLaycr才口丁能 产生非0的loss_o计算loss是会把所有层的loss_相加。learn
9、able parametersvectorshared_ptrBlob blobs前面提到过的,Layer学到的参数。Net:Net用容器的形式将多个Layer有序地放在一起,其H身实现的功能主要是对逐 层Layer进行初始化,以及提供Update ()的接口(更新网络参数),本身不能 对参数进行有效地学习过程。vectorshared_ptrLayer layers_;同样Net也存它自己的vectorBlobDtype氺& Forward(const vectorBlob* & bottom, Dtype* loss = NULL);voidNet:Backward();他们是对整个网络的
10、前向和方向传导,各调用一次就可以计算出网络的loss 了。 2. 4. Solver这个类中包含一个Net的指针,主耍是实现了训练模型参数所采用的优化算法,它所派生的类就可以对整个网络进行训练了。shared_ptrNet net_;不同的模型训练方法通过重载函数ComputeUpdateValue()实现计算叩date参 数的核心功能virtual void ComputeUpdateValue() = 0;最后当进行整个网络训练过程(也就是你运行Caffe训练某个模型)的时候,实 际上是在运行caffe, cpp中的train ()函数,而这个函数实际上是实例化一个 Solver对象,初始
11、化后调用了 Solver中的Solve()方法。而这个Solve()函 数主耍就是在迭代运行下面这两个函数,就是刚才介绍的哪几个函数。 ComputeUpdateValue();net_-Update();至此,从底M到顶M对Caffe的主耍结构都应该宥了大致的概念。为了集中重点 介绍Caffe的代码结构,文中略去了大量Caffe相关的实现细节和技巧,比如 Layer和Net的参数如何初始化,proto文件的定义,基于cblas的卷和等操作 的实现(cblas实现卷积这一点我的个人主页GanYuFei中的Caffe学习笔记 5-BLAS与boost:thread加速有介绍)等等就不列举了。整体
12、来看Layer部分代码最多,也反映出Caffe比较重视丰富网络单元的类型, 然而由于Caffe的代码结构高度层次化,使得某些研究以及应用(比如研究类似 非逐层连接的神经网络这种复杂的网络连接方式)难以在该平台实现。这也就是 -幵始说的一个不足。另外,Caffe基本数据单元都用Blob,使得数据在内存中的存储变得十分髙效, 紧凑,从而提升了整体训练能力,而同吋带來的问题是我们看见的一些pH卖性上 的不便,比如forward的参数也是直接用Blob而不是设计一个新类以增强可读 性。所以说性能的提升是以可读性为代价的。最后一点也是最重要的一点,我从Caffe学到了很多。第一次看的C+项目就看 到这么好的代码,实在是受益匪浅,在这里也感谢作者贾扬清等人的贡献。