阅读更多

0顶
0踩

开源软件

转载新闻 深度学习框架Caffe源码解析

2016-12-14 11:08 by 副主编 mengyidan1988 评论(0) 有4987人浏览
引用

作者:薛云峰(https://github.com/HolidayXue),主要从事视频图像算法的研究,就职于浙江捷尚视觉科技股份有限公司担任深度学习算法研究员。
本文来源微信公众号:深度学习大讲堂。
原文:深度学习框架Caffe源码解析
欢迎技术投稿、约稿、给文章纠错,请发送邮件至heyc@csdn.net

相信社区中很多小伙伴和我一样使用了很长时间的Caffe深度学习框架,也非常希望从代码层次理解Caffe的实现从而实现新功能的定制。本文将从整体架构和底层实现的视角,对Caffe源码进行解析。

Caffe总体架构
Caffe框架主要有五个组件,Blob,Solver,Net,Layer,Proto,其结构图如下图1所示。Solver负责深度网络的训练,每个Solver中包含一个训练网络对象和一个测试网络对象。每个网络则由若干个Layer构成。每个Layer的输入和输出Feature map表示为Input Blob和Output Blob。Blob是Caffe实际存储数据的结构,是一个不定维的矩阵,在Caffe中一般用来表示一个拉直的四维矩阵,四个维度分别对应Batch Size(N),Feature Map的通道数(C),Feature Map高度(H)和宽度(W)。Proto则基于Google的Protobuf开源项目,是一种类似XML的数据交换格式,用户只需要按格式定义对象的数据成员,可以在多种语言中实现对象的序列化与反序列化,在Caffe中用于网络模型的结构定义、存储和读取。



图1 Caffe源码总体架构图

Blob解析
下面介绍Caffe中的基本数据存储类Blob。Blob使用SyncedMemory类进行数据存储,数据成员 data_指向实际存储数据的内存或显存块,shape_存储了当前blob的维度信息,diff_这个保存了反向传递时候的梯度信息。在Blob中其实不是只有num,channel,height,width这种四维形式,它是一个不定维度的数据结构,将数据展开存储,而维度单独存在一个vector 类型的shape_变量中,这样每个维度都可以任意变化。

来一起看看Blob的关键函数,data_at这个函数可以读取的存储在此类中的数据,diff_at可以用来读取反向传回来的误差。顺便给个提示,尽量使用data_at(const vector& index)来查找数据。Reshape函数可以修改blob的存储大小,count用来返回存储数据的数量。BlobProto类负责了将Blob数据进行打包序列化到Caffe的模型中。

工厂模式说明
接下来介绍一种设计模式Factory Pattern,Caffe 中Solver和Layer对象的创建均使用了此模式,首先看工厂模式的UML的类图:



图2 工厂模式UML类图

如同Factory生成同一功能但是不同型号产品一样,这些产品实现了同样Operation,很多人看了工厂模式的代码,会产生这样的疑问为何不new一个出来呢,这样new一个出来似乎也没什么问题吧。试想如下情况,由于代码重构类的名称改了,或者构造函数参数变化(增加或减少参数)。而你代码中又有N处new了这个类。如果你又没用工厂,就只能一个一个找来改。工厂模式的作用就是让使用者减少对产品本身的了解,降低使用难度。如果用工厂,只需要修改工厂类的创建具体对象方法的实现,而其他代码不会受到影响。

举个例子,写代码少不得饿了要加班去吃夜宵,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory。

Solver解析
接下来切回正题,我们看看Solver这个优化对象在Caffe中是如何实现的。SolverRegistry这个类就是我们看到的上面的factory类,负责给我们一个优化算法的产品,外部只需要把数据和网络结构定义好,它就可以自己优化了。

Solver* CreateSolver(const SolverParameter& param)这个函数就是工厂模式下的CreateProduct的操作, Caffe中这个SolverRegistry工厂类可以提供给我们6种产品(优化算法):



这六种产品的功能都是实现网络的参数更新,只是实现方式不一样。那我们来看看他们的使用流程吧。当然这些产品类似上面Product类中的Operation,每一个Solver都会继承Solve和Step函数,而每个Solver中独有的仅仅是ApplyUpdate这个函数里面执行的内容不一样,接口是一致的,这也和我们之前说的工厂生产出来的产品一样功能一样,细节上有差异,比如大多数电饭煲都有煮饭的功能,但是每一种电饭煲煮饭的加热方式可能不同,有底盘加热的还有立体加热的等。接下里我们看看Solver中的关键函数。

Solver中Solve函数的流程图如下:



图3 Solver类Solve方法流程图

Solver类中Step函数流程图:



图4 Solver类Step方法流程图

Solver中关键的就是调用Sovle函数和Step函数的流程,你只需要对照Solver类中两个函数的具体实现,看懂上面两个流程图就可以理解Caffe训练执行的过程了。

Net类解析
分析过Solver之后我们来分析下Net类的一些关键操作。这个是我们使用Proto创建出来的深度网络对象,这个类负责了深度网络的前向和反向传递。以下是Net类的初始化方法NetInit函数调用流程:



图5 Net类NetInit方法流程图

Net的类中的关键函数简单剖析
  • ForwardBackward:按顺序调用了Forward和Backward。
  • ForwardFromTo(int start, int end):执行从start层到end层的前向传递,采用简单的for循环调用。
  • BackwardFromTo(int start, int end):和前面的ForwardFromTo函数类似,调用从start层到end层的反向传递。
  • ToProto函数完成网络的序列化到文件,循环调用了每个层的ToProto函数。
  • Layer解析
  • Layer是Net的基本组成单元,例如一个卷积层或一个Pooling层。本小节将介绍Layer类的实现。


Layer的继承结构



图6 Layer层的继承结构

Layer的创建
与Solver的创建方式很像,Layer的创建使用的也是工厂模式,这里简单说明下几个宏函数:

REGISTER_LAYER_CREATOR负责将创建层的函数放入LayerRegistry。



我们来看看大多数层创建的函数的生成宏REGISTER_LAYER_CLASS,可以看到宏函数比较简单的,将类型作为函数名称的一部分,这样就可以产生出一个创建函数,并将创建函数放入LayerRegistry。



REGISTER_LAYER_CREATOR(type, Creator_##type##Layer)

这段代码在split_layer.cpp文件中



REGISTER_LAYER_CLASS(Split)。
这样我们将type替换过以后给大家做个范例,参考下面的代码。



当然这里的创建函数好像是直接调用,没有涉及到我们之前工厂模式的一些问题。所有的层的类都是这样吗?当然不是,我们仔细观察卷积类。



卷积层怎么没有创建函数呢,当然不是,卷积的层的创建函数在LayerFactory.cpp中,截图给大家看下,具体代码如下:



这样两种类型的Layer的创建函数都有了对应的声明。这里直接说明除了有cudnn实现的层,其他层都是采用第一种方式实现的创建函数,而带有cudnn实现的层都采用的第二种方式实现的创建函数。

Layer的初始化

介绍完创建我们看看层里面的几个函数都是什么时候被调用的。

关键函数Setup此函数在之前的流程图中的NetInit时候被调用,代码如下:



这样整个Layer初始化的过程中,CheckBlobCounts被最先调用,然后接下来是LayerSetUp,后面才是Reshape,最后才是SetLossWeights。这样Layer初始化的生命周期大家就有了了解。

Layer的其他函数的介绍

Layer的Forward函数和Backward函数完成了网络的前向和反向传递,这两个函数在自己实现新的层必须要实现。其中Backward会修改bottom中blob的diff_,这样就完成了误差的方向传导。

Protobuf介绍
Caffe中的Caffe.proto文件负责了整个Caffe网络的构建,又负责了Caffemodel的存储和读取。下面用一个例子介绍Protobuf的工作方式:

利用protobuffer工具存储512维度图像特征:
  • message 编写:新建txt文件后缀名改为proto,编写自己的message如下,并放入解压的protobuff的文件夹里;




其中,dwFaceFeatSize表示特征点数量;pfFaceFeat表示人脸特征。

  • 打开windows命令窗口(cmd.exe)—->cd空格,把protobuff的文件路径复制粘贴进去——>enter;
  • 输入指令protoc *.proto –cpp_out=. ———>enter
  • 可以看到文件夹里面生成“ .pb.h”和“.pb.cpp”两个文件,说明成功了




下面可以和自己的代码整合了:
  • 新建你自己的工程,把“ .pb.h”和“.pb.cpp”两个文件添加到自己的工程里,并写上#include” *.pb.h”
  • 按照配库的教程把库配置下就可以了

VS下Protobuf的配库方法:
解决方案—->右击工程名—->属性
(1)c/c++—>常规—>附加包含目录—>

($your protobuffer include path)\protobuffer

(2)c/c++—>链接器–>常规—>附加库目录–>

($your protobuffer lib path)\protobuffer

(3) c/c++—>链接器–>输入—>附加依赖项–>

libprotobufd.lib;(带d的为debug模式)
或libprotobuf.lib;(不带d,为release模式)

使用protobuf进行打包的方法如下代码:



Caffe的模型序列化

BlobProto其实就是Blob序列化成Proto的类,Caffe模型文件使用了该类。Net调用每个层的Toproto方法,每个层的Toproto方法调用了Blob类的ToProto方法,这样完整的模型就被都序列化到proto里面了。最后只要将这个proto继承于message类的对象序列化到文件就完成了模型写入文件。Caffe打包模型的时候就只是简单调用了WriteProtoToBinaryFile这个函数,而这个函数里面的内容如下:



Proto.txt的简单说明

Caffe网络的构建和Solver的参数定义均由此类型文件完成。Net构建过程中调用ReadProtoFromTextFile将所有的网络参数读入。然后调用上面的流程进行整个caffe网络的构建。这个文件决定了怎样使用存在caffe model中的每个blob是用来做什么的,如果没有了这个文件caffe的模型文件将无法使用,因为模型中只存储了各种各样的blob数据,里面只有float值,而怎样切分这些数据是由prototxt文件决定的。

Caffe的架构在框架上采用了反射机制去动态创建层来构建Net,Protobuf本质上定义了graph,反射机制是由宏配合map结构形成的,然后使用工厂模式去实现各种各样层的创建,当然区别于一般定义配置采用xml或者json,该项目的写法采用了proto文件对组件进行组装。

总结
以上为Caffe代码架构的一个总体介绍,希望能借此帮助社区的小伙伴找到打开定制化Caffe大门的钥匙。本文作者希望借此抛砖引玉,与更多期望了解Caffe和深度学习框架底层实现的同行交流。
  • 大小: 87.4 KB
  • 大小: 10.1 KB
  • 大小: 49.3 KB
  • 大小: 27.6 KB
  • 大小: 41.1 KB
  • 大小: 29.6 KB
  • 大小: 3.3 KB
  • 大小: 137.3 KB
  • 大小: 43 KB
  • 大小: 24.8 KB
  • 大小: 58.2 KB
  • 大小: 15.6 KB
  • 大小: 68 KB
  • 大小: 49.2 KB
  • 大小: 59 KB
  • 大小: 34.1 KB
  • 大小: 167.3 KB
  • 大小: 5.8 KB
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 深度学习框架Caffe源码解析(概览)

    转自:http://www.leiphone.com/news/201612/oZUj5d437bpSl5wc.html Caffe总体架构 Caffe框架主要有五个组件,Blob,Solver,Net,Layer,Proto,其结构图如下图1所示。Solver负责深度网络的训练,每个Solver中包含...

  • Caffe-深度学习框架安装【windows】

    本文主要在windows下编译caffe源码,得到caffe环境。

  • 解析:深度学习框架Caffe源码

    相信很多小伙伴和我一样使用了很长时间的Caffe深度学习框架,也非常希望从代码层次理解Caffe的实现从而实现新功能的定制。本文将从整体架构和底层实现的视角,对Caffe源码进行解析。 1.Caffe总体架构 Caffe框架主要...

  • 深度学习框架caffe源码学习(一) — caffe.proto

    caffe的caffe.proto相关介绍

  • Caffe-深度学习框架安装【Ubuntu】

    本文主要在ubuntu下编译caffe源码,得到caffe环境。

  • Caffe源码解析

    作者:薛云峰...原文:深度学习框架Caffe源码解析 相信社区中很多小伙伴和我一样使用了很长时间的Caffe深度学习框架,也非常希望从代码层次理解Caffe的实现从而实现新功能的定制。本文将从整体架构

  • caffe源码深入学习8:caffe框架深度神经网络反传代码解析(二)之pooling层源码解析

    caffe源码深入学习8:caffe框架深度神经网络反传代码解析(二)之pooling层源码解析写在前面池化层源码及注释池化层源码解析最大池化平均池化 写在前面 在上一篇博客,即重启caffe源码深入学习7中,笔者从最简单的...

  • Ubuntu14.04下深度学习框架Caffe的搭建

    而Caffe就是一款优秀的易于学习的深度学习框架。Caffe本身由c++写成,支持Java和Python接口。而本篇文章就是Caffe的入门篇之一,平台的搭建。  首先,推荐在linux下进行Caffe的学习。本文使用的是Ubuntu的14.04...

  • 智慧园区3D可视化解决方案PPT(24页).pptx

    在智慧园区建设的浪潮中,一个集高效、安全、便捷于一体的综合解决方案正逐步成为现代园区管理的标配。这一方案旨在解决传统园区面临的智能化水平低、信息孤岛、管理手段落后等痛点,通过信息化平台与智能硬件的深度融合,为园区带来前所未有的变革。 首先,智慧园区综合解决方案以提升园区整体智能化水平为核心,打破了信息孤岛现象。通过构建统一的智能运营中心(IOC),采用1+N模式,即一个智能运营中心集成多个应用系统,实现了园区内各系统的互联互通与数据共享。IOC运营中心如同园区的“智慧大脑”,利用大数据可视化技术,将园区安防、机电设备运行、车辆通行、人员流动、能源能耗等关键信息实时呈现在拼接巨屏上,管理者可直观掌握园区运行状态,实现科学决策。这种“万物互联”的能力不仅消除了系统间的壁垒,还大幅提升了管理效率,让园区管理更加精细化、智能化。 更令人兴奋的是,该方案融入了诸多前沿科技,让智慧园区充满了未来感。例如,利用AI视频分析技术,智慧园区实现了对人脸、车辆、行为的智能识别与追踪,不仅极大提升了安防水平,还能为园区提供精准的人流分析、车辆管理等增值服务。同时,无人机巡查、巡逻机器人等智能设备的加入,让园区安全无死角,管理更轻松。特别是巡逻机器人,不仅能进行360度地面全天候巡检,还能自主绕障、充电,甚至具备火灾预警、空气质量检测等环境感知能力,成为了园区管理的得力助手。此外,通过构建高精度数字孪生系统,将园区现实场景与数字世界完美融合,管理者可借助VR/AR技术进行远程巡检、设备维护等操作,仿佛置身于一个虚拟与现实交织的智慧世界。 最值得关注的是,智慧园区综合解决方案还带来了显著的经济与社会效益。通过优化园区管理流程,实现降本增效。例如,智能库存管理、及时响应采购需求等举措,大幅减少了库存积压与浪费;而设备自动化与远程监控则降低了维修与人力成本。同时,借助大数据分析技术,园区可精准把握产业趋势,优化招商策略,提高入驻企业满意度与营收水平。此外,智慧园区的低碳节能设计,通过能源分析与精细化管理,实现了能耗的显著降低,为园区可持续发展奠定了坚实基础。总之,这一综合解决方案不仅让园区管理变得更加智慧、高效,更为入驻企业与员工带来了更加舒适、便捷的工作与生活环境,是未来园区建设的必然趋势。

  • labelme标注的json转mask掩码图,用于分割数据集 批量转化,生成cityscapes格式的数据集

    labelme标注的json转mask掩码图,用于分割数据集 批量转化,生成cityscapes格式的数据集

  • (参考GUI)MATLAB GUI漂浮物垃圾分类检测.zip

    (参考GUI)MATLAB GUI漂浮物垃圾分类检测.zip

  • 人脸识别_OpenCV_活体检测_证件照拍照_Demo_1741778955.zip

    人脸识别项目源码实战

  • 人脸识别_科大讯飞_Face_签到系统_Swface_1741770704.zip

    人脸识别项目实战

  • 跟网型逆变器小干扰稳定性分析与控制策略优化simulink仿真模型和代码.zip

    本仿真模型基于MATLAB/Simulink(版本MATLAB 2016Rb)软件。建议采用matlab2016 Rb及以上版本打开。(若需要其他版本可联系代为转换) CSDN详情地址:https://blog.csdn.net/qq_50594161/article/details/146242453sharetype=blogdetail&sharerId=146242453&sharerefer=PC&sharesource=qq_50594161&spm=1011.2480.3001.8118

  • 16-1文本表示&词嵌入.ipynb

    实战练习分词、创建词表、文本处理

  • 45页-零碳智慧园区标准解决方案:模块化、可扩展且可复制的解决方案.pdf

    在智慧园区建设的浪潮中,一个集高效、安全、便捷于一体的综合解决方案正逐步成为现代园区管理的标配。这一方案旨在解决传统园区面临的智能化水平低、信息孤岛、管理手段落后等痛点,通过信息化平台与智能硬件的深度融合,为园区带来前所未有的变革。 首先,智慧园区综合解决方案以提升园区整体智能化水平为核心,打破了信息孤岛现象。通过构建统一的智能运营中心(IOC),采用1+N模式,即一个智能运营中心集成多个应用系统,实现了园区内各系统的互联互通与数据共享。IOC运营中心如同园区的“智慧大脑”,利用大数据可视化技术,将园区安防、机电设备运行、车辆通行、人员流动、能源能耗等关键信息实时呈现在拼接巨屏上,管理者可直观掌握园区运行状态,实现科学决策。这种“万物互联”的能力不仅消除了系统间的壁垒,还大幅提升了管理效率,让园区管理更加精细化、智能化。 更令人兴奋的是,该方案融入了诸多前沿科技,让智慧园区充满了未来感。例如,利用AI视频分析技术,智慧园区实现了对人脸、车辆、行为的智能识别与追踪,不仅极大提升了安防水平,还能为园区提供精准的人流分析、车辆管理等增值服务。同时,无人机巡查、巡逻机器人等智能设备的加入,让园区安全无死角,管理更轻松。特别是巡逻机器人,不仅能进行360度地面全天候巡检,还能自主绕障、充电,甚至具备火灾预警、空气质量检测等环境感知能力,成为了园区管理的得力助手。此外,通过构建高精度数字孪生系统,将园区现实场景与数字世界完美融合,管理者可借助VR/AR技术进行远程巡检、设备维护等操作,仿佛置身于一个虚拟与现实交织的智慧世界。 最值得关注的是,智慧园区综合解决方案还带来了显著的经济与社会效益。通过优化园区管理流程,实现降本增效。例如,智能库存管理、及时响应采购需求等举措,大幅减少了库存积压与浪费;而设备自动化与远程监控则降低了维修与人力成本。同时,借助大数据分析技术,园区可精准把握产业趋势,优化招商策略,提高入驻企业满意度与营收水平。此外,智慧园区的低碳节能设计,通过能源分析与精细化管理,实现了能耗的显著降低,为园区可持续发展奠定了坚实基础。总之,这一综合解决方案不仅让园区管理变得更加智慧、高效,更为入驻企业与员工带来了更加舒适、便捷的工作与生活环境,是未来园区建设的必然趋势。

  • 人脸识别_活体检测_数据录入_登录系统Face_Login_1741778308.zip

    人脸识别项目源码实战

  • 学生信息管理平台是一个基于Java Web技术的综合性管理平台

    学生信息管理系统是一个基于Java Web技术的综合性管理平台。通过此系统,可以实现对学生、教师、选课信息等的动态管理, 提升学校管理效率。系统采用分层架构设计,前端使用HTML、CSS,JavaScript和jQuery,后端基于Servlet,JSP和Spring框架,数据库采用MySQL。主要有四个大功能,学生管理( 增加学生信息、删除学生信息、修改学生信息、查询学生信息)、教师管理(增加教师信息、删除教师信息、修改教师信息、查询教师信息)、选课信息管理(添加选课、查询选课情况、删除选课记录)、系统管理( 登录与注册功能、 用户角色管理(老师,学生,管理员)、系统日志查看)。 技术架构 1.前端技术 HTML,CSS:静态页面布局与样式 JavaScript,jQuery:动态交互、DOM操作和AJAX请求 2.后端技术 Servlet:控制层,处理用户请求 JSP:页面动态生成 Spring:依赖注入,业务逻辑分离 3.数据库 MySQL:存储学生、教师,课程等数据 JDBC:数据库连接与操作

  • PHP进阶系列之Swoole入门精讲(课程视频)

    本课程是 PHP 进阶系列之 Swoole 入门精讲,系统讲解 Swoole 在 PHP 高性能开发中的应用,涵盖 协程、异步编程、WebSocket、TCP/UDP 通信、任务投递、定时器等核心功能。通过理论解析和实战案例相结合,帮助开发者掌握 Swoole 的基本使用方法及其在高并发场景下的应用。 适用人群: 适合 有一定 PHP 基础的开发者、希望提升后端性能优化能力的工程师,以及 对高并发、异步编程感兴趣的学习者。 能学到什么: 掌握 Swoole 基础——理解 Swoole 的核心概念,如协程、异步编程、事件驱动等。 高并发处理——学习如何使用 Swoole 构建高并发的 Web 服务器、TCP/UDP 服务器。 实战项目经验——通过案例实践,掌握 Swoole 在 WebSocket、消息队列、微服务等场景的应用。 阅读建议: 建议先掌握 PHP 基础,了解 HTTP 服务器和并发处理相关概念。学习过程中,结合 官方文档和实际项目 进行实践,加深理解,逐步提升 Swoole 开发能力。

Global site tag (gtag.js) - Google Analytics