收藏 分享(赏)

caffe 网络结构几个部分简单介绍.doc

上传人:buyk185 文档编号:6357102 上传时间:2019-04-09 格式:DOC 页数:4 大小:30.50KB
下载 相关 举报
caffe 网络结构几个部分简单介绍.doc_第1页
第1页 / 共4页
caffe 网络结构几个部分简单介绍.doc_第2页
第2页 / 共4页
caffe 网络结构几个部分简单介绍.doc_第3页
第3页 / 共4页
caffe 网络结构几个部分简单介绍.doc_第4页
第4页 / 共4页
亲,该文档总共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)缺点

2、: 曾更新过重要函数接口。有人反映,偶尔会出现接口变换的情况,自己很久前写的代码可能过了一段时间就不能和新版本很好地兼容了。(现在更新速度放缓,接口逐步趋于稳定,感谢 评论区王峰的建议) 对于某些研究方向来说的人并不适合。这个需要对 Caffe 的结构有一定了解,(后面提到)。1.2. Caffe代码层次。回答里面有人说熟悉 Blob,Layer,Net,Solver 这样的几大类,我比较赞同。我基本是从这个顺序开始学习的,这四个类复杂性从低到高,贯穿了整个Caffe。把他们分为三个层次介绍。 Blob:是基础的数据结构,是用来保存学习到的参数以及网络传输过程中产生数据的类。 Layer:是网

3、络的基本单元,由此派生出了各种层类。修改这部分的人主要是研究特征表达方向的。 Net:是网络的搭建,将 Layer 所派生出层类组合成网络。Solver:是 Net 的求解,修改这部分人主要会是研究 DL 求解方向的。=2. Caffe进阶2.1. Blob:Caffe支持 CUDA,在数据级别上也做了一些优化,这部分最重要的是知道它主要是对 protocol buffer所定义的数据结构的继承,Caffe 也因此可以在尽可能小的内存占用下获得很高的效率。(追求性能的同时 Caffe也牺牲了一些代码可读性)在更高一级的 Layer中 Blob用下面的形式表示学习到的参数:vector blob

4、s_;这里使用的是一个 Blob的容器是因为某些 Layer包含多组学习参数,比如多个卷积核的卷积层。以及 Layer所传递的数据形式,后面还会涉及到这里:vector* vector* *top2.2. Layer:2.2.1. 5大 Layer派生类型Caffe十分强调网络的层次性,也就是说卷积操作,非线性变换(ReLU 等),Pooling,权值连接等全部都由某一种 Layer来表示。具体来说分为 5大类Layer NeuronLayer 类 定义于 neuron_layers.hpp 中,其派生类主要是元素级别的运算(比如 Dropout 运算,激活函数 ReLu,Sigmoid 等)

5、,运算均为同址计算 (in-place computation,返回值覆盖原值而占用新的内存)。 LossLayer 类 定义于 loss_layers.hpp 中,其派生类会产生 loss,只有这些层能够产生 loss。 数据层 定义于 data_layer.hpp 中,作为网络的最底层 ,主要实现数据格式的转换。 特征表达层(我自己分的类)定义于 vision_layers.hpp(为什么叫 vision 这个名字,我目前还不清楚),实现特征表达功能,更具体地说包含卷积操作,Pooling 操作,他们基本都会产生新的内存占用(Pooling 相对较小)。 网络连接层和激活函数(我自己分的类

6、)定义于 common_layers.hpp,Caffe 提供了单个层与多个层的连接,并在这个头文件中声明。这里还包括了常用的全连接层InnerProductLayer 类。2.2.2. Layer的重要成员函数在 Layer内部,数据主要有两种传递方式,正向传导(Forward)和反向传导(Backward)。Forward 和 Backward有 CPU和 GPU(部分有)两种实现。Caffe中所有的 Layer都要用这两种方法传递数据。virtual void Forward(const vector* virtual void Backward(const vector* Layer类

7、派生出来的层类通过这实现这两个虚函数,产生了各式各样功能的层类。Forward 是从根据 bottom计算 top的过程,Backward 则相反(根据 top计算 bottom)。注意这里为什么用了一个包含 Blob的容器(vector),对于大多数 Layer来说输入和输出都各连接只有一个 Layer,然而对于某些 Layer存在一对多的情况,比如 LossLayer和某些连接层。在网路结构定义文件(*.proto)中每一层的参数 bottom和 top数目就决定了 vector中元素数目。layers bottom: “decode1neuron“ / 该层底下连接的第一个 Layerb

8、ottom: “flatdata“ / 该层底下连接的第二个 Layertop: “l2_error“ / 该层顶上连接的一个 Layername: “loss“ / 该层的名字type: EUCLIDEAN_LOSS / 该层的类型loss_weight: 02.2.3. Layer的重要成员变量lossvector loss_;每一层又有一个 loss_值,只不多大多数 Layer都是 0,只有 LossLayer才可能产生非 0的 loss_。计算 loss是会把所有层的 loss_相加。learnable parametersvector blobs_;前面提到过的,Layer 学习到

9、的参数。2.3. Net:Net用容器的形式将多个 Layer有序地放在一起,其自身实现的功能主要是对逐层 Layer进行初始化,以及提供 Update( )的接口(更新网络参数),本身不能对参数进行有效地学习过程。vector layers_;同样 Net也有它自己的vector*void Net:Backward();他们是对整个网络的前向和方向传导,各调用一次就可以计算出网络的 loss了。2.4. Solver这个类中包含一个 Net的指针,主要是实现了训练模型参数所采用的优化算法,它所派生的类就可以对整个网络进行训练了。shared_ptr net_;不同的模型训练方法通过重载函数

10、ComputeUpdateValue( )实现计算 update参数的核心功能virtual void ComputeUpdateValue() = 0;最后当进行整个网络训练过程(也就是你运行 Caffe训练某个模型)的时候,实际上是在运行 caffe.cpp中的 train( )函数,而这个函数实际上是实例化一个 Solver对象,初始化后调用了 Solver中的 Solve( )方法。而这个 Solve( )函数主要就是在迭代运行下面这两个函数,就是刚才介绍的哪几个函数。ComputeUpdateValue();net_-Update();=至此,从底层到顶层对 Caffe的主要结构都应

11、该有了大致的概念。为了集中重点介绍 Caffe的代码结构,文中略去了大量 Caffe相关的实现细节和技巧,比如 Layer和 Net的参数如何初始化,proto 文件的定义,基于 cblas的卷积等操作的实现(cblas 实现卷积这一点我的个人主页 GanYuFei中的Caffe 学习笔记 5-BLAS与 boost:thread加速有介绍)等等就不一一列举了。整体来看 Layer部分代码最多,也反映出 Caffe比较重视丰富网络单元的类型,然而由于 Caffe的代码结构高度层次化,使得某些研究以及应用(比如研究类似非逐层连接的神经网络这种复杂的网络连接方式)难以在该平台实现。这也就是一开始说的一个不足。另外,Caffe 基本数据单元都用 Blob,使得数据在内存中的存储变得十分高效,紧凑,从而提升了整体训练能力,而同时带来的问题是我们看见的一些可读性上的不便,比如 forward的参数也是直接用 Blob而不是设计一个新类以增强可读性。所以说性能的提升是以可读性为代价的。最后一点也是最重要的一点,我从 Caffe学到了很多。第一次看的 C+项目就看到这么好的代码,实在是受益匪浅,在这里也感谢作者贾扬清等人的贡献。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > 网络与通信

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报