日期:2023-01-01 23:47:42 来源:
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
标签: 是否已经 卷积算子 激活函数
上一篇: 全球观点:曲靖交通事故经济纠纷律师怎么收费
下一篇: 年份怎么读 年份的读法
视讯!nba2006中文版 nba2004中文翻译
南昌有什么好玩的地方适合小朋友 南昌有什么好玩的地方
今日精选:太空铝浴室柜致命的缺点(太空铝和304不锈钢哪个好)
德国商业前景大幅恶化 德国国债走高
华通线缆(605196):上海证券交易所上市审核委员会2023年第56次审议会议结果
机枪科普:M85重机枪
最新:软件测试需要学什么多久_软件测试需要学什么
同仁医院挂号时间(同仁医院挂号时间怎么样)
人偶被熊孩子扇脸踢踹后生气反击,网友一边倒喊“支持”?
广州市启动雷雨大风Ⅳ级应急响应
miss you 英文歌(miss you 英语短语)
全球热议:什么是端节?有什么由来?
遇见秦岭路,时尚风景线
最全汇总!31省区市高考分数线公布|天天快看点
全球速讯:宏昌电子:全资子公司珠海宏昌与晶化科技签订《合作框架协议书》及《技术开发(委托)合同》
网友爆料蔡徐坤工作室开始招聘法务 要求有律师执业资格证
国乒师徒情:60岁小杨教练飞行30小时,只为看一眼孙颖莎 天天要闻
【速看料】【东方同人】幻想谭——纯粹的迷途但尚有目标
及时语获数千万元Pre-A+轮融资 专注打造跨境出海智能客服平台
端午诵诗文 经典永传承——花溪区委老干部局、花溪区老干部党校、花溪区老年大学联合开展端午节中华经典诵读活动 焦点报道
今日热文:聚焦现代种业发展 陕西省深入推进良种繁育基地建设
潍坊经济区城投16亿私募债项目状态更新为“已反馈”
兰州野生动物园夜场有什么项目(附夜场开放时间)
光之美少女剧场版_头条
全球速递!杜特尔特警告菲律宾战争风险:原因就是美国在菲拥有基地
财政部8日发布数据显示,今年8月,全国发行新增债券642亿元,其中一般债券126亿元、专项债券516亿元。全国发行再融资债券3267亿元,其中一
文娱界怀旧生意俨然商机无限:61岁崔健的线上演唱会吸引4600万人观看,音乐节目《声生不息·港乐季》中叶倩文等老牌歌手刷屏……长短视频平
近日,《盛世修典——中国历代绘画大系先秦汉唐、宋、元画特展》在位于杭州的浙江美术馆举行。据了解,本次大展中通过数字3D打印复原技术将
月光下、锦江岸,游客们登船赏湖,畅游天府之国,沉浸式感受唐宋时期的成都盛景;深圳福田以“虎”为主题的禧春集
人民网北京2月15日电 (记者孙竞)近日,教育部印发了《幼儿园保育教育质量评估指南》(以下简称《评估指南》)
美在新时代——中国美术馆典藏精品特展(第二期)
致敬老将!热爱可抵岁月漫长
微视频|字里藏情迎元宵
【每日一习话】世界上最大的幸福莫过于为人民幸福而奋斗
人民网评:创业带动就业,为毕业生铺就发展平台