caffe模型文件解析_深度学习 Caffe 初始化流程理解(数据流建立)

深度学习 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的输出数据。 具体的形式如下图(单输入和多输入的情形):
6e70eb89f3b613d16d137a79e38e92e7.png

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

2670d5db67af47da679d75fe792491e9.png

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

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

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

  1. 链接本层的bottom数据( int Net::AppendBottom(const NetParameter& param, const int layer_id, const int bottom_id, set* available_blobs, map* 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* available_blobs, map* 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); } } } }复制代码
  1. b. 之后,是对使用同一个top的后续层的bottom的blob进行改名,使用与上一步相同的命名规则进行改名。

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

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

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

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

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

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

相关文章

函数计算机怎么去掉fix,excel怎么使用fix函数取整

fiv函数的作用是取整&#xff0c;在excel当中该如何使用呢?下面就跟学习啦小编一起看看吧。excel使用fix函数取整的步骤1、首先我们打开一个工作样表作为例子。2、使用altf11组合快捷键进入vbe编辑器&#xff0c;插入一个新的模块&#xff0c;并在模块中输入以下代码&#xff…

问道五周年服务器维护公告,问道五周年 欢乐嘉年华

任务卷轴任务卷轴记录卷轴任务的道具&#xff0c;可以交易、摆摊、放入商店、卖给NPC、丢弃等操作&#xff0c;道具为打怪掉落或者商城购买&#xff0c;分为5个等级&#xff0c;等级越高&#xff0c;难度系数越高。卷轴使用1、右键点击使用道具&#xff0c;与道具等级不符的玩家…

datagridview设置为勾选才可编辑_使用lightroom前,做好这几项设置,有助于更好使用...

工欲善其事&#xff0c;必先利其器。每一款软件都有它需要特别关注的地方&#xff0c;在使用前做好相应的配置&#xff0c;可以大大提升使用体验&#xff0c;正所谓“磨刀不误砍柴工”。那lightroom使用前需要进行哪些设置呢&#xff1f;一、进行【首选项】设置1、如何打开【首…

惠普服务器u盘做win7系统,惠普u盘装win7系统 利用u盘装win7系统

现如今随着社会水平的提高&#xff0c;无论办公还是生活都是越来越离不开电脑&#xff0c;电脑品牌也很多&#xff0c;惠普电脑是比较受人关注的品牌电脑&#xff0c;惠普电脑在使用过程中系统可能会越来越卡顿或者出问题需要U盘重装系统&#xff0c;有些新手用户对于系统重装还…

发那科攻丝回退参数_参数-Fanuc数控系统的攻丝拉拔动作倍率即回退速度倍率

众所周知Fanuc数控系统的参数多如牛毛。上千的参数&#xff0c;并且有的还是八位&#xff0c;虽然Fanuc发布有相关的参数说明书。但是&#xff0c;作为最终用户的我们&#xff0c;有的也只是公开发布的&#xff0c;也没有更新更全的相关资料。即便是有了相关书籍&#xff0c;又…

旋转轨迹_谁是最可怕的压轴题?——直线运动轨迹

运动问题是数学物理中非常喜欢研究的问题&#xff0c;这和我们本生生活的三维空间有密切的关系&#xff0c;我们无时无刻都在运动着&#xff0c;不论是坐着、站着还是躺着&#xff0c;都在不断运动。运动有复杂的运动&#xff0c;也有简单的运动&#xff0c;今天我们我们来聊一…

elementui表单校验原始密码_javascript 中入门数据校验

1.onSubmit 放在表单中,返回false为不提交 &#xff0c;所以 放一个函数在里面所有的 数据获取&#xff0c;数据判断&#xff1b;都在内&#xff1b;&#xff08;把一个value放到一个值&#xff0c;和另一个value值比对&#xff09;&#xff1b;2.获取提交的数据 &#xff0c;判…

状态反射在体育运动中的作用_体育运动木地板时刻运行在最佳状态的秘诀

每日、每月和年度的维护可保持体育运动地板的外观和运动性能表现在最佳状态。大中小学校体育馆和商业运营场馆的维保人员承担着很多责任&#xff0c;其中最重要的是运动地板的护理和维护。体育场馆的运动地面一般由体育木地板、PVC地板或硅PU、丙烯酸地面等组成&#xff0c;因此…

chrome自动提交文件_实用!8个 chrome插件玩转GitHub,单个文件下载小意思

本文收录在个人博客&#xff0c;欢迎来寻宝实用&#xff01;8个 chrome插件玩转GitHub&#xff0c;单个文件下载小意思​mp.weixin.qq.com作为程序员对 GitHub 应该都不会陌生&#xff0c;我经常沉迷其中&#xff0c;找一些惊艳的项目或者工具。不过用的时间久了&#xff0c;发…

c++保留小数点后三位数_C++保留有效位与保留小数位

如果想要保留n位小数 根据C++官网上的解释,该函数没有指定的返回类型,并且该函数用于设定输出操作上的小数精确位。 然后返回值中解释:未指定返回值,这个函数仅用于数据流修改操作上。 说了这么多,我想要表达的意思就是当我们需要将精确后的小数保存(将a精确后保存赋值给…

的translate插件_知否 ?知否 ?React插件了解一下!

为什么选择插件&#xff0c;而不是组件&#xff1f; 调用简单 this.$toast("xxx") &#xff0c;不必再模板中提前定义 , 动态插入移除插件独立于业务更新不影响代码逻辑&#xff0c;做到热更新抽象,封装适用于toast&#xff0c;Dialog&#xff0c;Alert&#xff0c;…

分级调节是调节机制吗_机制砂大热,5种制砂工艺及特点介绍,选对生产工艺,保证高效生产...

随着我国大部分地区河砂、湖砂禁采、限采&#xff0c;机制砂迎来发展好时机&#xff0c;各地新建生产线如火如荼。人工机制砂工艺大致经历了由锤式破碎机制砂、棒磨机制砂、立轴冲击式破碎机( 以下简称“立轴破”) 制砂等的单破碎段制砂工艺&#xff0c;到立轴破碎机与棒磨机联…

cadence自动生成铺铜_干货 | 国内铜湿法冶金工艺现状分析

更多、更及时的交易信息&#xff0c;干货内容&#xff0c;请关注易矿网来源 | 网络编辑 | 易矿资讯&#xff0c;转载请注明出处1.国内外铜湿法冶金技术发展现状自1968年以来&#xff0c;世界上已设计、建设并运转了约50家浸出—溶剂萃取—电积厂&#xff0c;其中美国有16家&…

dataframe合并两个表_Pandas 数据处理 | 怎么对多个数据表合并,你了解么?

点击上方 Z先生点记&#xff0c;加为星标第一时间收到 Python 技术干货&#xff01;merge() 函数用于合并两个 DataFrame 对象或 Series&#xff0c;数据处理时经常会用到这个函数&#xff0c;官网给出该函数的定义如下&#xff1a;pandas.merge(left, right, how: str inner,…

中fuse_保险丝座中保险丝的材质,结构,接线方式以及区别的介绍

保险丝材料主要是由铝锑合金等低熔点合金制成的。保险丝必需是易熔化的金属丝&#xff0c;才能在电流大时及时熔断&#xff0c;起到保护作用&#xff0c;所以通常用铅锑合金丝。保险丝的结构&#xff1a;一般保险丝由三个部分组成&#xff1a;一是熔体部分&#xff0c;它是保险…

找对象年龄差多大最好_女生找对象到底最看重什么?调查了全球6万多名女性的结果是......

文/英国那些事儿微信号&#xff1a;hereinuk“怎么想找个女朋友这么难啊&#xff01;&#xff1f;”这种吐槽估计不少单身男生应该都有过&#xff0c;“女生到底对找男朋友都有啥要求啊&#xff1f;&#xff01;”这个问题应该也是很多男生心中久久得不到解答的问题。不过就在最…

个人生活助手app_美居App 6版重磅升级 开启智慧生活新范式

2019年12月30日,美的IoT在美的全球创新中心HolaCon场景实验室举办了主题为“全屋智慧2020智慧生活新范式”美居焕新分享会,现场发布了美居App 6版一系列重磅升级的新功能。图:美居焕新会现场美居是美的智能家居的用户入口。截至目前,已经有超过4000万的用户通过美居使用美的智能…

程序员述职报告范文_物流人员述职报告范文(通用5篇)

物流人员述职报告范文(通用5篇)时间是看不见也摸不到的&#xff0c;就在你不注意的时候&#xff0c;它已经悄悄的和你擦肩而过&#xff0c;回顾过去的工作&#xff0c;倍感充实&#xff0c;收获良多&#xff0c;需要认真地为此写一份述职报告。你还在为写述职报告而苦恼吗&…

java环境变量javac不能成功 win7_配置Java环境

jdk下载 jdk.rar运行JDK文件点击下一步点击“更改目录”&#xff0c;将安装目录设置在自己喜欢的地方&#xff08;建议&#xff09;&#xff0c;或者直接点击下一步&#xff08;此时默认装到C盘&#xff09; 此处演示安装到G:codepathjava安装完后直接点解关闭&#xff08;注&a…

制图折断线_CAD制图初学入门之CAD标注时必须要区分的两个概念

由于很多CAD制图初学入门者对于CAD软件中的部分功能了解的不是很清楚&#xff0c;所以在使用CAD标注功能的时候可能会遇到各种问题&#xff0c;比如CAD折弯标注和CAD线性折弯标注。下面就给大家分享一些与CAD标注有关的CAD制图初学入门技巧吧&#xff01;在使用浩辰CAD软件进行…