深度学习 Caffe 初始化流程理解(数据流建立)

之前在简书的文章,搬迁过来 ^-^
本文是作者原创,如有理解错误,恳请大家指出,如需引用,请注明出处。

#Caffe FeatureMap数据流的建立 ##用语解释

  • FeatureMap: 输入的图片信息或者经过多层处理后的图片信息。
  • weights: 只针对卷积层存在的权重系数。
  • caffe :文中提到的caffe均指caffed1.0,如果使用caffe2.0会特别指出。

在讲解FeatureMap的数据流之前,首先需要明确一下caffe的大体结构,caffe的整体逻辑结构分为3层,分别是Net,Layer和Blob,分别的作用如下:

  • Net: 该层处于CAFFE的最顶层,主要负责对模型文件的读写,根据模型文件的内容建立相应的Layer,填充对应层的数据并进行相关的调用。
  • Layer: 该层是实际的执行单元,常见的如卷积层,Pooling层都是处于这一逻辑层。
  • Blob:该层是一个内存管理的模块,为Layer和Net提供相应的存储空间,屏蔽上层对于内存分配,CPU,GPU切换的感知。

由上面的讲解分层关系不难看出,FeatureMap在整个Caffe框架中,不属于任何一个Layer,所以它被最顶层的Net层所持有。Net层就需要能够通过caffe的模型文件推倒出每一层所依赖的输入,这样才能构建出一个完整的数据链。在这种需求下Caffe引入了两个定义:

  • bottom: Layer的输入数据。
  • top: Layer的输出数据。 具体的形式如下图(单输入和多输入的情形):

所以Net在调用Layer之前就一定知道了Layer的所需要的输入数据,也就是需要Net层所持有的Blob变量需要被那些层所引用。这些在模型文件中也有直观的反应(为了方便截图,删除了下图proto中关于Convlution的参数配置):

上述的工作都在Net的Init(void Net::Init(const NetParameter& in_param))函数里面进行了处理,主要实现的就是根据上图左侧的模型文件得到需要建立的Layer的类型,并将各个Layer间的数据链接起来。函数中的关键参数如下:

名称功能
in_param存放由protobuf转换出的模型文件
bottom_vecs_存放每一层中的输入数据类型为:vector<vector<Blob*> >
top_vecs_存放每一层中的输出数据类型为:vector<vector<Blob*> >
available_blobs存放每一层中的输出数据类型为:vector<vector<Blob*> >

##常规的数据链建立流程是(单输入单输出的场景):

  1. 链接本层的bottom数据( int Net::AppendBottom(const NetParameter& param, const int layer_id, const int bottom_id, set<string>* available_blobs, map<string, int>* blob_name_to_idx) ),该函数会使用从当前layer持有的bottom信息中得到对应bottom的层名,然后利用该名称找到对应的blob,并加入到bottom_vecs_。

  2. 链接本层的top数据(void Net::AppendTop(const NetParameter& param, const int layer_id,const int top_id, set<string>* available_blobs, map<string, int>* blob_name_to_idx)),该操作就是将本层的输出数据加入到top_vecs_中,并与 layer_id相关联,这里同时负责Blob对象的申请。 需要指出的是,新的Blob对象是在top中进行创建的,在Bottom中只是将上一层top的指针添加进来,同时在这个过程中CAFFE还利用available_blobs进行了异常校验,在每次新加入top的时候记录对应的Blob名称,在bottom中链接上一层top之后,在available_blobs中将对应的Blob名称剔除。相关伪代码如下:

     for (int layer_id = 0; layer_id < param.layer_size(); ++layer_id) {AppendBottom();AppendTop();}
    复制代码

##多输入的数据链的建立: 细心的同学应该已经发现,当数据为多bottom输入的时候,因为available_blobs的数据被上一次的链接过程删掉,则再次链接相同bottom的时候,会出先异常告警,在这种情况下我们就要引入CAFFE的另外一处理函数 void InsertSplits(const NetParameter& param, NetParameter* param_split),该函数的主要功能就是对 top输出到多个 Layer的情况进行分割。 整个函数分为两个部分:

  1. 遍历整个网络,记录每一个Layer的top的使用情况,记录结构放在 top_idx_to_bottom_count中。

  2. 遍历整个网络,对 top_idx_to_bottom_count > 1 的情况进行处理: a. 首先是对top被多个层使用的Layer进行分割,主要的做法是在该层的后面新建一个Layer ,这个新的Layer的会按照 top_idx_to_bottom_count 的个数和约定的分割名称(SplitBlobName)去新建top,添加层的代码如下(此处只展示核心的创建过程,具体调用流程请自行跟踪):

     //该函数执行新层的添加void ConfigureSplitLayer(const string& layer_name, const string& blob_name,const int blob_idx, const int split_count, const float loss_weight,LayerParameter* split_layer_param) {split_layer_param->Clear();split_layer_param->add_bottom(blob_name);split_layer_param->set_name(SplitLayerName(layer_name, blob_name, blob_idx));split_layer_param->set_type("Split");for (int k = 0; k < split_count; ++k) {//split_count就是该top被引用的个数//添加了分割后的top//命名由SplitBlobName生成		    split_layer_param->add_top(SplitBlobName(layer_name, blob_name, blob_idx, k));if (loss_weight) {if (k == 0) {split_layer_param->add_loss_weight(loss_weight);} else {split_layer_param->add_loss_weight(0);}}}}
    复制代码

    b. 之后,是对使用同一个top的后续层的bottom的blob进行改名,使用与上一步相同的命名规则进行改名。

下面以SqueezeNet1.1为例,展示了添加新的分割层的实例:

![Upload new_split_layer.jpg failed. Please try again.]

通过这样一个分割的转化,达到了对多输入数据流的建立。

##遗留问题 上面讲的是在初始化阶段对FeatureMap数据的链接关系的建立,但是对于weights的填充和初始图片的输入并没有进行分析。

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

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

相关文章

C#中的Clipboard与ContextMenuStrip应用举例

今天&#xff0c;突然想起了怎样在一个文本中实现复制、剪切与粘贴的功能&#xff0c;并给这些功能添加右键的快捷方式。于是&#xff0c;就用自己的VS2008写了一个简单的小应用&#xff0c;以熟悉C#中剪贴板与快捷菜单的使用。 首先&#xff0c;我们不难发现&#xff0c;剪贴板…

控制台ui_设计下一代控制台UI

控制台ui游戏UX (GAMES UX) Yesterday’s Sony presentation showed us the final look of the PlayStation 5, as well as an impressive of next-gen games that will be released with it. What we didn’t get to see, however, is the new operating system and it’s use…

写给前端新手看的一些模块化知识

大家好&#xff0c;我是若川。最近组织了源码共读活动&#xff0c;感兴趣的可以点此加我微信ruochuan12 进群参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。已进行三个月了&#xff0c;很多小伙伴表示收获颇丰。一、 为什么需要模块化以前没有模块化时…

重学前端学习笔记(八)--JavaScript中的原型和类

笔记说明 重学前端是程劭非&#xff08;winter&#xff09;【前手机淘宝前端负责人】在极客时间开的一个专栏&#xff0c;每天10分钟&#xff0c;重构你的前端知识体系&#xff0c;笔者主要整理学习过程的一些要点笔记以及感悟&#xff0c;完整的可以加入winter的专栏学习【原文…

代码实现照片素描_我的代码素描之旅

代码实现照片素描In 2018 I started the process of consistently creating and posting my code sketches online. These are small animations I make with code and post on instagram. Through these sketches I tried to visually express my ideas using color, animatio…

GCC参数详解

转自&#xff1a;http://www.cnblogs.com/fence/archive/2009/12/18/1627138.html GCC参数详解 gcc and g分别是gnu的c & c编译器 gcc/g在执行编译工作的时候&#xff0c;总共需要4步1.预处理,生成.i的文件[预处理器cpp]2.将预处理后的文件不转换成汇编语言,生成文件.s[编…

真效率神器,UI稿智能转换成前端代码,准确率极高

大家好&#xff0c;我是若川。在这充满网络促销活动的几个月&#xff0c;倍感压力的&#xff0c;除了你的口袋&#xff0c;是否还有程序员的发量呢&#xff1f;每年的双十一、双十二购物狂欢节&#xff0c;各大电商平台都会上线让消费者充满购买欲望的活动页面&#xff0c;而这…

PPT图标的正确使用和插入与编辑形状

PPT图标的正确使用和插入与编辑形状 通过图标可以以符号的形式直观地传递信息。 一&#xff0c;实战&#xff1a;在销售工作计划中插入图标 PowerPoint 2016中提供了多种类型的图标&#xff0c;用户可根据需要在幻灯片中插入所需的图标。 二&#xff0c;实战&#xff1a;更改销…

几个用于序列化的代码片段

参考JavaScriptSerializer,一般用来做JSON格式化http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptserializer.aspx http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptconverter.aspxDataContractSeria…

桌面图标摆放图案_用图标制作醒目的图案

桌面图标摆放图案Level up your video calls with a custom backdrop created using Noun Project icons.使用使用Noun Project图标创建的自定义背景来升级视频通话。 The only thing more visually pleasing than a well-designed icon is a neat, eye-catching pattern made…

3个多月,近3000人参与的源码共读,诚邀加入~

大家好&#xff0c;我是若川。众所周知&#xff0c;从8月份开始&#xff0c;我组织了源码共读活动&#xff0c;每周学习200行左右的源码&#xff0c;到现在持续了3个多月&#xff0c;坚持答疑解惑。帮助了不少人&#xff0c;还是挺开心的。另外&#xff0c;涌现了很多优秀的读者…

upc 组队赛18 STRENGTH【贪心模拟】

STRENGTH 题目链接 题目描述 Strength gives you the confidence within yourself to overcome any fears, challenges or doubts. Feel the fear and do it anyway! If you have been going through a rough time and feel burnt out or stressed, the Strength card encourag…

JSONNull

最近用JSONObject&#xff0c;感觉比xml好用一些&#xff0c;json的打包和解包都比较清晰和容易&#xff0c;最近遇到一个问题&#xff0c;将一个JSON对象解析&#xff0c;存到hashmap中去&#xff0c;然后再从hashmap取出数据&#xff0c;遇到jsonnull的问题&#xff0c;本以为…

“这张图告诉你什么?”

For data to be impactful, it must be understood.为了使数据具有影响力&#xff0c;必须理解它。 I’ve happily spent hundreds and hundreds of hours of my life watching users misunderstand data visualizations. I’m strangely hooked on it.我快乐地度过了数百个小…

我们从 UmiJS 迁移到了 Vite

大家好&#xff0c;我是若川。最近组织了源码共读活动&#xff0c;感兴趣的可以点此加我微信ruochuan12 进群参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。已进行三个月了&#xff0c;很多小伙伴表示收获颇丰。我们从 UmiJS迁移到 Vite 已经上线半年…

将DataTable的内容以EXCEl的形式导出到本地

1.在搞项目的时候一般会遇到&#xff0c;将GridView或者Repeater的内容以Excel的形式保存到本地&#xff0c;即导出功能。我总结了两个方法。 方法一&#xff1a; 1 DataTable dt query.GetItems().GetDataTable();2 if (dt ! null)3 {4 …

智能家居数据库设计_设计更智能的数据表

智能家居数据库设计重点 (Top highlight)Data tables are hard. There are many different ways to think about them. So, naturally, the first step would be to figure out what your users need.数据表很难。 有许多不同的方式来考虑它们。 因此&#xff0c;自然地&#x…

可能是全网首个前端源码共读活动,诚邀你加入一起学习

大家好&#xff0c;我是若川。众所周知&#xff0c;从8月份开始&#xff0c;我组织了源码共读活动&#xff0c;每周学习200行左右的源码&#xff0c;到现在持续了3个多月&#xff0c;坚持答疑解惑。帮助了不少人&#xff0c;还是挺开心的。另外&#xff0c;涌现了很多优秀的读者…

vsftpd 的配置项目

基本配置说明&#xff1a; 1&#xff09;local_root/ftpfile(当本地用户登入时&#xff0c;将被更换到定义的目录下&#xff0c;默认值为各用户的家目录) 2&#xff09;anon_root/ftpfile(使用匿名登入时&#xff0c;所登入的目录) 3&#xff09;use_localtimeYES(默认是GMT时…

线段树专辑——pku 3667 Hotel

http://poj.org/problem?id3667 哈哈&#xff0c;经典中的经典题啊。利用线段树求最大连续空闲区间&#xff0c;并返回空闲区间的起点坐标。 View Code 1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 using namespace std; 5 6 …