2023-01-02 16:38:35
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站视频课
关于石榴皮的功效是真的吗的内容,包含石榴皮茶的功效如何呢?石榴皮的功效和作用?石榴皮的功效是什么?石榴皮的功效与作用是什么?石榴皮的功
保存方法一冰箱保存阳澄湖大闸蟹 大家都知道阳澄湖大闸蟹是鲜活水产品,离水后保存时间较短,所购数量能在三天左右的时间吃完的大闸蟹保存比较简
一般民事纠纷的诉讼时效都为3年,自权利人知道或者应当知道权利受到损害以及义务人之日起计算。法律另有规定的,依照其规定。无效合同自始无效
智通财经APP讯,华泰证券公布,周易经选举出任公司第六届董事会职工代表董事,任期与公司第六届董事会非职工代表董事的任期相同,即自公司2022
2022年12月31日公告发布
央视网消息:随着新年的脚步临近,这几天,各地的年俗气息也逐渐浓郁起来。在江西省万安县农村,现在正是晾晒过年“腊味”进行“
2023元旦佛山地铁几点关闭?2023年元旦期间,佛山地铁晚上关闭时间都会延长一个小时或一个半小时。为了更好地向乘客提供运营服务,方便市民假
12月29日,华富收益增强债券A最新单位净值为1 6042元,累计净值为2 4372元,较前一交易日上涨0 0%。历史数据显示该基金近1个月下跌0 47%,近3
海默科技公告,公司控股股东、实际控制人窦剑文、公司股东张立刚和张立强与山东新征程能源有限公司签署《股份转让框架协议》,正在筹划向山东
(徐正宽、杨泽昱)走进思南县三道水乡的“陈薯”加工厂,机器轰鸣,流水线上井然有序,工人干得热火朝天。惹人喜爱的红薯淀粉通
元旦假期高速不免费!江西出口车流预计同比降两至三成
>>外部因素强干扰北向资金“失重”A股市场2022年是A股市场上外资表现罕见弱势的一年。受海内外宏观经济与重大事件扰动,今年以来北向资金流入
挖贝网12月28日,发那数控(835245)发公告称,公司董事会于2022年12月26日收到总经理助理李光福递交的辞职报告,自2022年12月26日起辞职生效
腾讯的风控策略让普通用户抓狂经历是这样的,昨天有事要登录下QQ号,因为很久没用过QQ的缘故,现在是在一个新设备上登录,提示我需要扫码才能
联环药业公布公开发行可转换公司债券预案,此次发行可转债拟募集资金总额(含发行费用)不超过人民币4 5亿元(含4 5亿元),扣除发行费用后拟投资
截至2022年12月28日收盘,众兴菌业(002772)报收于8 07元,下跌4 61%,换手率3 46%,成交量13 92万手,成交额1 14亿元。12月28
乐居财经张林霞12月28日,尚太科技登陆深交所,IPO发行价33 88元 股,发行市盈率16 28倍,截止到上午9:30,尚太科技(SZ001301)停牌前涨3
齐风鲁韵,闪耀鹏城。第十八届中国(深圳)国际文化产业博览交易会将于2022年12月28日至2023年1月2日在深圳国际会展中心举办,山东展团将精彩
格隆汇12月27日丨万和电气公布,基于公司长期发展战略和规划,结合公司各项业务发展现状,为进一步优化公司资产及业务结构,增强竞争力,提高
12月27日,外交部发言人汪文斌主持例行记者会。有记者提问,中方发布了关于中外人员往来的新措施,这是否意味着中方从下个月开始发放旅游签证
中新网西宁12月27日电 (李隽 韩世峰)27日,记者从国家税务总局青
近日,协鑫能科公告称,全资子公司协鑫锂电与Zim-ThaiTantalum(Private)Limited公司(“Zim-ThaiTantalum津巴布韦”)于当日签署了《锂矿资
今日进行的NBA圣诞大战,太阳客场125-128惜败掘金。
特斯拉在中国大陆的第10000个超级充电桩今日落成,位于上海东方明珠超级充电站,这是一座里程碑般的存在,具有极高的纪念意义 财经网汽车讯
(原标题:TCL中环:公司晶体、晶片全产能兼容N型产品,依靠工业4 0生产体系可实现N、P型产品灵活切换)同花顺(300033)金融研究中心12月25日
本报讯(王东岭、赵勇)围场满族蒙古族自治县山湾子乡把基层党建融入乡村振兴各环节、全链条,以党建高质量迈进助力乡村振兴高质量发展。突出
支持长按多选设备创建批量控制与自动化IT之家了解到,小米米家App是智能硬件管理平台,不仅连接小米及生态链公司的智能产品,同时也开放接入第
央视网消息:商务部今天(12月23日)公布的数据显示,今年1—11月,我国实际使用外资同比增长9 9%。1—11月,全国实际使用外资金额11560 9亿元,按可
智通财经APP讯,贵研铂业(600459)(600459 SH)公告,公司推进市场化体制机制改革走向深入,拟以信息材料事业部为基础,改制设立全资子公司贵研电子材