https://github.com/zjhellofss/KuiperInfer 欢迎pr和点赞
手把手教大家去写一个深度学习推理框架 B站视频课程
(资料图片)
Relu是一种非线性激活函数,它的特点有运算简单,不会在梯度处出现梯度消失的情况,而且它在一定程度上能够防止深度学习模型在训练中发生的过拟合现象。Relu的公式表达如下所示,「如果对于深度学习基本概念不了解的同学,可以将Relu当作一个公式进行对待,可以不用深究其背后的含义。」
我们今天的任务就是来完成这个公式中的操作,「值得注意的是,在我们的项目中,x和y可以理解为我们在第二、第三节中实现的张量类(tensor).」
Operator类就是我们在第一节中说过的计算图中「节点」的概念,计算图的另外一个概念是数据流图,如果同学们忘记了这个概念,可以重新重新翻看第一节课程。
在我们的代码中我们先定义一个「Operator」类,它是一个父类,其余的Operator,包括我们本节要实现的ReluOperator都是其派生类,「Operator中会存放节点相关的参数。」例如在「ConvOperator」中就会存放初始化卷积算子所需要的stride, padding, kernel_size等信息,本节的「ReluOperator」就会带有「thresh」值信息。
我们从下方的代码中来了解Operator类和ReluOperator类,它们是父子关系,Operator是基类,OpType记录Operator的类型。
enumclassOpType{kOperatorUnknown=-1,kOperatorRelu=0,};classOperator{public:OpTypekOpType=OpType::kOperatorUnknown;virtual~Operator()=default;explicitOperator(OpTypeop_type);};
ReluOperator实现:
classReluOperator:publicOperator{public:~ReluOperator()override=default;explicitReluOperator(floatthresh);voidset_thresh(floatthresh);floatget_thresh()const;private:floatthresh_=0.f;};
我们会在operator类中存放从「计算图结构文件」得到的信息,例如在ReluOperator中存放的thresh值作为一个参数就是我们从计算图结构文件中得到的,计算图相关的概念我们已经在第一节中讲过。
下一步我们需要根据ReLuOperator类去完成ReluLayer的初始化,「他们的区别在于ReluOperator负责存放从计算图中得到的节点信息,不负责计算」,而ReluLayer则「负责具体的计算操作」,同样,所有的Layer类有一个公共父类Layer. 我们可以从下方的代码中来了解两者的关系。
classLayer{public:explicitLayer(conststd::string&layer_name);virtualvoidForwards(conststd::vector>>&inputs,std::vector>>&outputs);virtual~Layer()=default;private:std::stringlayer_name_;};
其中Layer的Forwards方法是具体的执行函数,负责将输入的inputs中的数据,进行relu运算并存放到对应的outputs中。
classReluLayer:publicLayer{public:~ReluLayer()override=default;explicitReluLayer(conststd::shared_ptr&op);voidForwards(conststd::vector>>&inputs,std::vector>>&outputs)override;private:std::shared_ptrop_;};
这是集成于Layer的ReluLayer类,我们可以看到其中有一个op成员,是一个ReluOperator指针,「这个指针中负责存放ReluLayer计算时所需要用到的一些参数」。此处op_存放的参数比较简单,只有ReluOperator中的thresh参数。
我们再看看是怎么使用ReluOperator去初始化ReluLayer的,先通过统一接口传入Operator类,再转换为对应的ReluOperator指针,最后再通过指针中存放的信息去初始化「op_」.
ReluLayer::ReluLayer(conststd::shared_ptr&op):Layer("Relu"){CHECK(op->kOpType==OpType::kOperatorRelu);ReluOperator*relu_op=dynamic_cast(op.get());CHECK(relu_op!=nullptr);this->op_=std::make_shared(relu_op->get_thresh());}
我们来看一下具体ReluLayer的Forwards过程,它在执行具体的计算,完成Relu函数描述的功能。
voidReluLayer::Forwards(conststd::vector>>&inputs,std::vector>>&outputs){CHECK(this->op_!=nullptr);CHECK(this->op_->kOpType==OpType::kOperatorRelu);constuint32_tbatch_size=inputs.size();for(inti=0;iempty());conststd::shared_ptr>&input_data=inputs.at(i);input_data->data().transform([&](floatvalue){floatthresh=op_->get_thresh();if(value>=thresh){returnvalue;}else{return0.f;}});outputs.push_back(input_data);}}
在for循环中,首先读取输入input_data, 再对input_data使用armadillo自带的transform按照我们给定的thresh过滤其中的元素,如果「value」的值大于thresh则不变,如果小于thresh就返回0.
最后,我们写一个测试函数来验证我们以上的两个类,节点op类,计算层layer类的正确性。先判断Forwards返回的outputs是否已经保存了relu层的输出,输出大小应该assert为1. 随后再进行比对,我们应该知道在thresh等于0的情况下,第一个输出index(0)和第二个输出index(1)应该是0,第三个输出应该是3.f.
TEST(test_layer,forward_relu){usingnamespacekuiper_infer;floatthresh=0.f;std::shared_ptrrelu_op=std::make_shared(thresh);std::shared_ptr>input=std::make_shared>(1,1,3);input->index(0)=-1.f;input->index(1)=-2.f;input->index(2)=3.f;std::vector>>inputs;std::vector>>outputs;inputs.push_back(input);ReluLayerlayer(relu_op);layer.Forwards(inputs,outputs);ASSERT_EQ(outputs.size(),1);for(inti=0;iindex(0),0.f);ASSERT_EQ(outputs.at(i)->index(1),0.f);ASSERT_EQ(outputs.at(i)->index(2),3.f);}}
gitclonehttps://gitee.com/fssssss/KuiperCourse.gitgitcheckoutfouth
标签: 是否已经 卷积算子 激活函数
我们的课程主页https: github com zjhellofss KuiperInfer欢迎pr和点赞手把手教大家去写一个深度学习推理框架B站视频课
到立案大厅,由立案大厅进行审查,对于符合立案条件的,给予立案。如果你们双方不在同地居住的,则按原告就被告的原则,你要到男方的所在地提
性病是一种可怕的传染病,性病对女性的危害更可怕,所以女性朋友们一定要爱护自己。那么,女性的性病是什么呢?常见的女性性病有哪些?1、衣原
1、保险代理人是根据保险人的委托,向保险人收取佣金,并在保险人授权的范围内代为办理保险业务的机构或者个人。2、虽然现实生活中,保险代理
点击上方“小白学视觉”,选择加 "星标 "或“置顶”重磅干货,第一时间送达在本文中,使用Python编程语言和库Keras和OpenCV建立CNN模型,成功地对交通
1、菜心要挑选新鲜的,菜叶子要绿油油,肥大短为佳。2、如果菜心开花的说明老了,菜心长度为十五厘米左右最佳。3、菜心拿起来,中间脆嫩。新鲜
1、股权转让后,并不影响债务的处理,仍然由公司财产承担债务。2、根据法律规定,公司是企业法人,有独立的法人财产,享有法人财产权。公司以
中新网12月30日电国美零售日前发布公告称,附属公司国美电器有限公司于近日收到北京市第一中级人民法院通知,沈阳盛兴达厨卫用品有限公司、辽
中国网是国务院新闻办公室领导,中国外文出版发行事业局管理的国家重点新闻网站。本网通过10个语种11个文版,24小时对外发布信息,是中国进行
【橡胶期货在12500震荡调整后期预计走势延续震荡上行】申银万国期货表示,周四橡胶走势回落,RU05收于12685,下跌105,国外产区供应顺畅,年末
网贷逾期一般会上征信,有些借贷机构在用户逾期后一天后就会上报给征信机构,而有些借贷机构则是会在几天后上报给征信机构,因为有些借贷机构可
肥美石蟹悄然上市广东侨乡台山初春的鲜味
当地时间12月28日,德国莱茵能源集团(RWE)宣布与美国桑普拉基础设施公司(SempraInfrastructure)达成15年的长期液化天然气采购协议,总采购量为
2022年,威胜信息共计取得有效专利693件、其中发明专利119件;共计软著823件,集成电路布图10件。有效专利总数较2021年增加36件。 2022年新
↑点击蓝字关注极市平台作者丨科技猛兽编辑丨极市平台极市导读本文提出一种卷积调制模块,利用卷积来建立关系,这比注意力机制在处理高分辨率
1、茉莉花是在初夏到晚秋之间的开花的,花期大概在5-8月份左右,夏季的时候是它的盛花期,如果养护得当的话,它甚至可以一直开到10-11月份左右
红塔证券(601236)12月28日在投资者关系平台上答复了投资者关心的问题。投资者:中国烟草市值第一的公司,请问贵司如何能够成为行业龙头,市值
秦川机床(000837)12月28日在投资者关系平台上答复了投资者关心的问题。投资者:董秘,你好。贵公司前三季度业绩不是很理想,第四季度业绩如何
截至2022年12月27日收盘,电科数字(600850)报收于19 86元,下跌1 05%,换手率0 45%,成交量2 47万手,成交额4908 67万元。
游客、航司等都在摩拳擦掌。 “我昨晚第一时间订好了从香港经东京到西雅图的往返机票,去美国探亲过年。”12月27日,北京白领徐烨告诉记...
CFi CN讯: 远东股份(股票代码:600869)发布关于控股股东股份解除质押及再质押的公告。截至公告披露日,控股股东及其一致行动人累计质押
《浮图缘》是由王鹤棣、陈钰琪领衔主演的古装电视剧,讲述了权倾朝野的掌印肖铎与先帝的才人步音楼之间的爱情故事,那么这部电视剧实在哪里进
宏碁掠夺者专为对性能有要求的用户打造的高性能固态硬盘。这款固态硬盘采用M 2、PCIe4 0x4接口(兼容PCIe3 0),支持NVMe技术,提供了7400MB s
重庆水务:关于重庆水务集团股份有限公司收购污水项目关联交易的独立董事意见
据天眼查官网显示,近日,财通证券(601108)(601108 SH)子公司财通创新投资有限公司发生工商变更,注册资本由38亿人民币增至50亿人民币,增幅约31
天弘中证光伏产业ETF净值下跌1 66%请保持关注
点蓝色字关注“机器学习算法工程师”设为星标,干货直达!PyTorch2 0引入了**torch compile()**来加速模型,这篇文章我们将介绍如何使用
截至2022年12月23日收盘,建设机械(600984)报收于5 72元,较上周的5 87元下跌2 56%。本周,建设机械12月22日盘中最高价报6 08元。12月23日盘
香港大学首推“顶尖运动员入学计划”
3月16—17日,安徽出现了明显的降温和降水天气,多地出现了暴雨,局地大暴雨,气温也明显下降,18日最低气温甚至跌到了个位数。据气象部门
奥密克戎变异株,正给国内疫情防控带来新的挑战。当前,吉林省疫情防控也到了最关键紧急的时期,吉林省政府迅速做出了兴建方舱医院的决策部
制造业是立国之本、强国之基。作为现代经济的核心和实体经济的血脉,金融支持制造业高质量发展责无旁贷。近年来,徽商银行认真贯彻落实安徽
<script src="http: tv people com cn img player v js">< script><script>showPlayer({id:" pvservice xml 202
1月25日,国网绍兴供电公司通过配电自动化主站平台远程控制位于绍兴南部山区线路末端发电机成功启动,成功以小成
Copyright © 2015-2022 北冰洋城市网版权所有 备案号:沪ICP备2020036824号-3 联系邮箱:562 66 29@qq.com