caffe源码阅读(1)_整体框架和简介(摘录)

原文链接:https://www.zhihu.com/question/27982282

1.Caffe代码层次。
回答里面有人说熟悉Blob,Layer,Net,Solver这样的几大类,我比较赞同。我基本是从这个顺序开始学习的,这四个类复杂性从低到高,贯穿了整个Caffe。把他们分为三个层次介绍。

  • Blob:作为数据传输的媒介,无论是网络权重参数,还是输入数据,都是转化为Blob数据结构来存储
  • Layer:作为网络的基础单元,神经网络中层与层间的数据节点、前后传递都在该数据结构中被实现,层类种类丰富,比如常用的卷积层、全连接层、pooling层等等,大大地增加了网络的多样性
  • Net:作为网络的整体骨架,决定了网络中的层次数目以及各个层的类别等信息
  • Solver:作为网络的求解策略,涉及到求解优化问题的策略选择以及参数确定方面,修改这个模块的话一般都会是研究DL的优化求解的方向。
1. Blob:
1.1. Blob的类型描述
Caffe内部采用的数据类型主要是对protocol buffer所定义的数据结构的继承,因此可以在尽可能小的内存占用下获得很高的效率,虽然追求性能的同时Caffe也会牺牲了一些代码可读性。
直观来说,可以把Blob看成一个有4维的结构体(包含数据和梯度),而实际上,它们只是一维的指针而已,其4维结构通过shape属性得以计算出来。
1.2. Blob的重要成员函数和变量
shared_ptr<SyncedMemory> data_ //数据
shared_ptr<SyncedMemory> diff_ //梯度
void Blob<Dtype>::Reshape(const int num, const int channels, const int height,
const int width)
重新修改Blob的形状(4维),并根据形状来申请动态内存存储数据和梯度。
inline int count(int start_axis, int end_axis) const
计算Blob所需要的基本数据单元的数量。
在更高一级的Layer中Blob用下面的形式表示学习到的参数:
vector<shared_ptr<Blob<Dtype> > > blobs_; 
这里使用的是一个Blob的容器是因为某些Layer包含多组学习参数,比如多个卷积核的卷积层。
以及Layer所传递的数据形式,后面还会涉及到这里:
vector<Blob<Dtype>*> &bottom;
vector<Blob<Dtype>*> *top

2.2. Layer:
2.2.1. 5大Layer派生类型
Caffe十分强调网络的层次性,也就是说卷积操作,非线性变换(ReLU等),Pooling,权值连接等全部都由某一种Layer来表示。具体来说分为5大类Layer
  • NeuronLayer类 定义于neuron_layers.hpp中,其派生类主要是元素级别的运算(比如Dropout运算,激活函数ReLu,Sigmoid等),运算均为同址计算(in-place computation,返回值覆盖原值而占用新的内存)。
  • LossLayer类 定义于loss_layers.hpp中,其派生类会产生loss,只有这些层能够产生loss
  • 数据层 定义于data_layer.hpp中,作为网络的最底层,主要实现数据格式的转换。
  • 特征表达层(我自己分的类)定义于vision_layers.hpp(为什么叫vision这个名字,我目前还不清楚),实现特征表达功能,更具体地说包含卷积操作,Pooling操作,他们基本都会产生新的内存占用(Pooling相对较小)。
  • 网络连接层和激活函数(我自己分的类)定义于common_layers.hpp,Caffe提供了单个层与多个层的连接,并在这个头文件中声明。这里还包括了常用的全连接层InnerProductLayer类。
2.2.2. Layer的重要成员函数
在Layer内部,数据主要有两种传递方式,正向传导(Forward)反向传导(Backward)。Forward和Backward有CPU和GPU(部分有)两种实现。Caffe中所有的Layer都要用这两种方法传递数据。
virtual void Forward(const vector<Blob<Dtype>*> &bottom, vector<Blob<Dtype>*> *top) = 0; virtual void Backward(const vector<Blob<Dtype>*> &top, const vector<bool> &propagate_down, vector<Blob<Dtype>*> *bottom) = 0; 
Layer类派生出来的层类通过这实现这两个虚函数,产生了各式各样功能的层类。Forward是从根据bottom计算top的过程,Backward则相反(根据top计算bottom)。注意这里为什么用了一个包含Blob的容器(vector),对于大多数Layer来说输入和输出都各连接只有一个Layer,然而对于某些Layer存在一对多的情况,比如LossLayer和某些连接层。在网路结构定义文件(*.proto)中每一层的参数bottom和top数目就决定了vector中元素数目。
layers {bottom: "decode1neuron" // 该层底下连接的第一个Layer bottom: "flatdata" // 该层底下连接的第二个Layer top: "l2_error" // 该层顶上连接的一个Layer name: "loss" // 该层的名字 type: EUCLIDEAN_LOSS // 该层的类型 loss_weight: 0 } 
2.2.3. Layer的重要成员变量
loss
vector<Dtype> loss_; 
每一层又有一个loss_值,只不多大多数Layer都是0,只有LossLayer才可能产生非0的loss_。计算loss是会把所有层的loss_相加。
learnable parameters
vector<shared_ptr<Blob<Dtype> > > blobs_; 
前面提到过的,Layer学习到的参数。

2.3. Net:
Net用容器的形式将多个Layer有序地放在一起,其自身实现的功能主要是对逐层Layer进行初始化,以及提供Update( )的接口(更新网络参数),本身不能对参数进行有效地学习过程。
vector<shared_ptr<Layer<Dtype> > > layers_;
同样Net也有它自己的
vector<Blob<Dtype>*>& Forward(const vector<Blob<Dtype>* > & bottom, Dtype* loss = NULL); void Net<Dtype>::Backward(); 
他们是对整个网络的前向和方向传导,各调用一次就可以计算出网络的loss了。
2.4. Solver
这个类中包含一个Net的指针,主要是实现了训练模型参数所采用的优化算法,它所派生的类就可以对整个网络进行训练了。
shared_ptr<Net<Dtype> > net_;
不同的模型训练方法通过重载函数ComputeUpdateValue( )实现计算update参数的核心功能
virtual void ComputeUpdateValue() = 0;
最后当进行整个网络训练过程(也就是你运行Caffe训练某个模型)的时候,实际上是在运行caffe.cpp中的train( )函数,而这个函数实际上是实例化一个Solver对象,初始化后调用了Solver中的Solve( )方法。而这个Solve( )函数主要就是在迭代运行下面这两个函数,就是刚才介绍的哪几个函数。
ComputeUpdateValue();
net_->Update(); 

==============================================================

至此,从底层到顶层对Caffe的主要结构都应该有了大致的概念。为了集中重点介绍Caffe的代码结构,文中略去了大量Caffe相关的实现细节和技巧,比如Layer和Net的参数如何初始化,proto文件的定义,基于cblas的卷积等操作的实现(cblas实现卷积这一点我的个人主页GanYuFei中的《Caffe学习笔记5-BLAS与boost::thread加速》有介绍)等等就不一一列举了。

整体来看Layer部分代码最多,也反映出Caffe比较重视丰富网络单元的类型,然而由于Caffe的代码结构高度层次化,使得某些研究以及应用(比如研究类似非逐层连接的神经网络这种复杂的网络连接方式)难以在该平台实现。这也就是一开始说的一个不足。

另外,Caffe基本数据单元都用Blob,使得数据在内存中的存储变得十分高效,紧凑,从而提升了整体训练能力,而同时带来的问题是我们看见的一些可读性上的不便,比如forward的参数也是直接用Blob而不是设计一个新类以增强可读性。所以说性能的提升是以可读性为代价的。
最后一点也是最重要的一点,我从Caffe学到了很多。第一次看的C++项目就看到这么好的代码,实在是受益匪浅,在这里也感谢作者贾扬清等人的贡献。

Net中有必要认识的几个名字:
这里再补充几点:
1.使用Linux 的grep指令来快速追踪某个关键字:在caffe根目录下输入: grep -n -H -R "REGISTER_LAYER_CREATOR"(举例),其中-n 显示行号 -H显示文件名 -R递归查找每个子目录

    

转载于:https://www.cnblogs.com/zf-blog/p/6427624.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/417270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net 转义包含转义的字符串

Regex.Unescape(string) 传入字符串内容&#xff08;\为实体字符&#xff09;&#xff1a; "a\r\n\tb"返回字符串&#xff1a; "ab"

http协议 php,PHP中的HTTP协议

无状态&#xff1a;每次请求完成就结束连接&#xff0c;下一次请求与上次请求没有关系。报文&#xff1a;HTTP交互的信息。telnet模拟请求&#xff1a;// GET方式&#xff0c;最后回车换行Aston$ telnet 127.0.0.1 80GET /Tools/Test/http.php HTTP/1.1Host:localhost// POST方…

Mysql 查询返回结果空时间错误

数据库连接字符串中增加allow zero datetimetrue;

程序员的生存发展和出路

编程能力与编程年龄 | | 酷 壳 - CoolShellhttp://coolshell.cn/articles/10688.html 技术人员的发展之路 | | 酷 壳 - CoolShellhttp://coolshell.cn/articles/17583.html 什么是工程师文化&#xff1f; | | 酷 壳 - CoolShellhttp://coolshell.cn/articles/17497.html 程序员…

前端学习(2282)全选和反选问题

<!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><style type"text/css">#f {font-size: 50px;font-family: 幼圆;}#fater {width: 100%;height: 100%;border: 2px solid black;}#btn {wid…

php5.3 sql server,php5.3连接sqlserver2005

操作系统win2003服务器:iisphp 5.3.26 sqlserver2005php5.3以后,已经不对sqlserver支持连接扩展了,不过微软官方还是对php5.3以后进行了扩展解决方案。1.确认要连接sqlserver的数据库版本为20052.确认php支持的vc9还是vc6,这里可以从phpinfo()里看出来。3.确认php的版本为5.…

.Net Framework 4.5 zip压缩原生支持

必须引用项目的 System.IO.Compression.FileSystem 程序集using System.IO.Compression; string startPath "c:\example\start";string zipPath "c:\example\result.zip";string extractPath "c:\example\extract";//压缩ZipFile.CreateFromD…

JavaMail--发送html邮件

//发邮件用到的两个包"org.springframework:spring-context-support:$springVersion","javax.mail:mail:1.4.7" web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee&q…

2003 64位系统 IIS6 32位模式运行

要运行 32 位版本的 ASP.NET 2.0&#xff0c;请按照以下步骤操作&#xff1a; 单击“开始”&#xff0c;单击“运行”&#xff0c;键入 cmd&#xff0c;然后单击“确定”。键入以下命令启用 32 位模式&#xff1a;cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET …

java错误switch找不到符号,Java使用StringBuilder时--找不到符号

写了个Test试了下Java的StringBuilder类代码如下&#xff1a;import java.util.Scanner;public class StringBuilder1{public static void main(String[] args){Scanner in new Scanner(System.in);System.out.println("开始用许多小段的字符串构建一个字符串&#xff1a…

sqlserver2008r2修改表不能保存的解决方法

菜单 -> Tools -> Options -> Designers -> 把“Prevent saving changes that require table re-creation” 前面复选框的勾去掉。

阿里云CentOS服务器挂载数据盘

本次使用的是centOS6.7 64位系统 第一步&#xff1a;处理阿里云磁盘挂载问题 查看磁盘情况&#xff0c;本次机器系统盘为阿里云赠送的20G&#xff0c;数据盘为100G 其中/dev/xvda为系统盘&#xff0c;/dev/xvdb为数据盘&#xff0c;数据盘暂未做任何操作&#xff0c;要使用的话…

The Closest M Points BZOJ 3053

The Closest M Points 【问题描述】 软工学院的课程很讨厌&#xff01;ZLC同志遇到了一个头疼的问题&#xff1a;在K维空间里面有许多的点&#xff0c;对于某些给定的点&#xff0c;ZLC需要找到和它最近的m个点。 &#xff08;这里的距离指的是欧几里得距离&#xff1a;D(p, q)…

vs2012 官方下载地址

http://download.microsoft.com/download/B/0/F/B0F589ED-F1B7-478C-849A-02C8395D0995/VS2012_ULT_chs.iso

php ci post 请求,CI框架中判断post,ajax,get请求的方法

这篇文章主要介绍了关于CI框架中判断post,ajax,get请求的方法 &#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下CI框架当中并没有提供&#xff0c;类似tp框架中IS_POST,IS_AJAX,IS_GET的方法。所有就得我们自己造轮子了。下面就…

InstallShield 常用常量

BATCH_INSTALL 指示当传输文件采用LOCKEDFILE或SHAREDFILE时是否锁定文件CMDLINE Setup.exe传递的命令行参数COMMONFILES Common files全路径如“c:\program file\common files”ERRORFILENAMEFOLDER_DESKTOP Windows桌面folder的路径FOLDER_PROGRAMS Windows开始菜单中 开始\程…

[position]返回顶部

position:fixed;实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>返回顶部</title> </head> <body style"margin: 0"> <div style"width: 50px;height: 50px…

InstallShield SdShowMsg未关闭导致安装程序无法停止

strMsg"hehe";SdShowMsg(strMsg,true);//显示消息 ……SdShowMsg(strMsg,false);//关闭消息SdShowMsg后要关闭窗口&#xff0c;否则安装程序会一直运行&#xff0c;点击完成之后也会在任务栏里。

php 自定义行间距,phpstorm 常见设置

0.转载于 http://www.cnblogs.com/dc10101/archive/2013/01/03/2842590.html1.关于字体颜色 亮度 调整内容如下&#xff1a;ctrlalts打开Settings界面&#xff0c;Editor > Colors&Fonts > Font。Default scheme是亮色调&#xff0c;但我想定制一套暗背景的环境&…