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
标签: 是否已经 卷积算子 激活函数
2021-09-18
天天观天下!自制深度学习推理框架-实现我们的第一个算子Relu-第三课
打架被拘留了几天_环球精选
央视再发三连评:在烟火气中看到一个热气腾腾的中国
医护人员尽全力守护患儿健康 希望能为孩子再多做一点 世界看点
精彩看点:2022武汉教资笔试考试各科具体时间安排
长痘痘到底可以吃柚子不?
怡亚通(002183)12月29日主力资金净卖出5971.14万元-世界快资讯
嗨袋借款逾期不还会影响征信吗
2023海口元旦会新增哪些特色商业街区?
环球微动态丨一镜到底穿越2022
2023北京朝阳区继续执行全域禁放烟花爆竹(官方公布)
环球消息!【手慢无】小米电视音响大促 199元再送迷你蓝牙小音响
坚守长期主义,天齐锂业荣膺“金梧桐奖”最佳投资者关系管理上市公司
微速讯:有关于苍白等待的句子精选509句
贵州贵黄高速贵定连接线甘溪特大桥通车
又一个大厂跌至谷底……然后反弹!这是不是回暖信号?!
今日要闻!舒淇回台湾现身高铁,玩自拍惊喜合体大咖女星
12月27日基金净值:建信优化配置混合A最新净值1.5277,涨1.27%
《2022中国城市长租市场发展蓝皮书》:一线城市业主出租意愿或超过买卖意愿|世界观点
异动快报:兴通股份(603209)12月27日14点33分触及涨停板
丰立智能董秘回复:公司产品暂未为特斯拉供货,为特斯拉供货是公司的未来目标之一
天华超净(300390):公司董事会、监事会换届选举完成暨部分董事、监事届满离任
简讯:华自科技最新公告:18万股限制性股票待解禁 实际可上市流通数为0股
每日时讯!房企再融资活动正沿着三大逻辑线展开
武汉理工大学为考研学子筑牢保障防线 当前时讯
抗旱保收,合肥交出高分答卷
商务部介绍稳外贸工作措施:支持外贸企业开展供采对接-每日视点
丝路视觉: 关于持股5%以上大股东减持股份计划实施完毕的公告
微动态丨鹤岗原市长梁成军一审获死缓,法院:论罪当判死刑 因立功情节从轻
小贷逾期5000还不上会上征信吗 天天消息
人工智能+教育,曙光探索人才培育新路径
(年终经济观察)中国布局释放经济“内力”_天天热议
TECHSTARACQ-Z(07855)发售初步提呈发售获轻微超额认购
辉隆股份(002556.SZ):截至12月21日第二轮回购已累计回购209.535万股
环球最资讯丨2023黑兔年本命年要注意什么 勤劳上进可收获惊喜
欧元区国家网购交易额占欧元支付总额的17% 当前资讯
每日短讯:荣耀80 GT上架:外观正式公布
纳思达(002180)12月5日主力资金净卖出1425.03万元|信息
考cfa考试需要看什么书-今日观点
每日信息:中欧班列(武汉)今年开行量达600列
罗平锌电董秘回复:感谢提问,公司宏泰矿业试运行正常生产
许昌经济技术开发区消防救援大队开展火灾隐患排查工作 全球快报
世界观速讯丨45分惨案!鹈鹕狂胜勇士 英格拉姆34+6普尔26分
中国石油建成投运宁夏首座充换电一体站_世界速看
一亩地要多少魔芋种子,珠芽魔芋种子价格|天天视讯
全球微资讯!本周盘点(12.12-12.16):大商股份周涨0.23%,主力资金合计净流出1376.02万元
启迪药业董秘回复:药物服用应在医生指导下对症用药
天天速读:中远海能(01138)聘任陈建荣为副总经理
工伤如果老板不赔偿那该怎么办 每日速递
即时:四季度以来452家上市公司斥资逾200亿元回购股份
天府旅游名牌日历海报丨绵阳市桑枣镇:山清水润 温泉相伴-环球新动态
天天微动态丨欧新海:用实干托起旅游梦
孚能科技(688567)12月13日主力资金净卖出5025.98万元_世界观点
环球今热点:远东传动: 董事会决议公告
浙江建投:12月12日获融资买入1917.48万元
成都先导(688222.SH):高管暨核心技术人员万金桥辞职
世界速递!新版国家职业分类大典增加158个新职业
美亚柏科:公司业绩存在第四季度集中的特点,当前正全力以赴加快产品交付和项目验收
天天快播:天津村镇银行整体经营平稳 金融服务乡镇覆盖率100%
微电生理(688351)12月7日主力资金净卖出1327.23万元