0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Relu算子的介紹

jf_pmFSk4VX ? 來源:GiantPandaCV ? 2023-01-11 17:07 ? 次閱讀

Relu算子的介紹

Relu是一種非線性激活函數(shù),它的特點(diǎn)有運(yùn)算簡單,不會在梯度處出現(xiàn)梯度消失的情況,而且它在一定程度上能夠防止深度學(xué)習(xí)模型在訓(xùn)練中發(fā)生的過擬合現(xiàn)象。Relu的公式表達(dá)如下所示,「如果對于深度學(xué)習(xí)基本概念不了解的同學(xué),可以將Relu當(dāng)作一個(gè)公式進(jìn)行對待,可以不用深究其背后的含義。」

我們今天的任務(wù)就是來完成這個(gè)公式中的操作,「值得注意的是,在我們的項(xiàng)目中,x和y可以理解為我們在第二、第三節(jié)中實(shí)現(xiàn)的張量類(tensor).」

Operator類

Operator類就是我們在第一節(jié)中說過的計(jì)算圖中「節(jié)點(diǎn)」的概念,計(jì)算圖的另外一個(gè)概念是數(shù)據(jù)流圖,如果同學(xué)們忘記了這個(gè)概念,可以重新重新翻看第一節(jié)課程。

在我們的代碼中我們先定義一個(gè)「Operator」類,它是一個(gè)父類,其余的Operator,包括我們本節(jié)要實(shí)現(xiàn)的ReluOperator都是其派生類,「Operator中會存放節(jié)點(diǎn)相關(guān)的參數(shù)?!?/strong>例如在「ConvOperator」中就會存放初始化卷積算子所需要的stride, padding, kernel_size等信息,本節(jié)的「ReluOperator」就會帶有「thresh」值信息。

我們從下方的代碼中來了解Operator類和ReluOperator類,它們是父子關(guān)系,Operator是基類,OpType記錄Operator的類型。

enumclassOpType{
kOperatorUnknown=-1,
kOperatorRelu=0,
};

classOperator{
public:
OpTypekOpType=OpType::kOperatorUnknown;

virtual~Operator()=default;

explicitOperator(OpTypeop_type);
};

ReluOperator實(shí)現(xiàn):

classReluOperator:publicOperator{
public:
~ReluOperator()override=default;

explicitReluOperator(floatthresh);

voidset_thresh(floatthresh);

floatget_thresh()const;

private:
floatthresh_=0.f;
};

Layer類

我們會在operator類中存放從「計(jì)算圖結(jié)構(gòu)文件」得到的信息,例如在ReluOperator中存放的thresh值作為一個(gè)參數(shù)就是我們從計(jì)算圖結(jié)構(gòu)文件中得到的,計(jì)算圖相關(guān)的概念我們已經(jīng)在第一節(jié)中講過。

下一步我們需要根據(jù)ReLuOperator類去完成ReluLayer的初始化,「他們的區(qū)別在于ReluOperator負(fù)責(zé)存放從計(jì)算圖中得到的節(jié)點(diǎn)信息,不負(fù)責(zé)計(jì)算」,而ReluLayer則「負(fù)責(zé)具體的計(jì)算操作」,同樣,所有的Layer類有一個(gè)公共父類Layer. 我們可以從下方的代碼中來了解兩者的關(guān)系。

classLayer{
public:
explicitLayer(conststd::string&layer_name);

virtualvoidForwards(conststd::vector>>&inputs,
std::vector>>&outputs);

virtual~Layer()=default;
private:
std::stringlayer_name_;
};

其中Layer的Forwards方法是具體的執(zhí)行函數(shù),負(fù)責(zé)將輸入的inputs中的數(shù)據(jù),進(jìn)行relu運(yùn)算并存放到對應(yīng)的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類,我們可以看到其中有一個(gè)op成員,是一個(gè)ReluOperator指針,「這個(gè)指針中負(fù)責(zé)存放ReluLayer計(jì)算時(shí)所需要用到的一些參數(shù)」。此處op_存放的參數(shù)比較簡單,只有ReluOperator中的thresh參數(shù)。

我們再看看是怎么使用ReluOperator去初始化ReluLayer的,先通過統(tǒng)一接口傳入Operator類,再轉(zhuǎn)換為對應(yīng)的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過程,它在執(zhí)行具體的計(jì)算,完成Relu函數(shù)描述的功能。

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循環(huán)中,首先讀取輸入input_data, 再對input_data使用armadillo自帶的transform按照我們給定的thresh過濾其中的元素,如果「value」的值大于thresh則不變,如果小于thresh就返回0.

最后,我們寫一個(gè)測試函數(shù)來驗(yàn)證我們以上的兩個(gè)類,節(jié)點(diǎn)op類,計(jì)算層layer類的正確性。

先判斷Forwards返回的outputs是否已經(jīng)保存了relu層的輸出,輸出大小應(yīng)該assert為1. 隨后再進(jìn)行比對,我們應(yīng)該知道在thresh等于0的情況下,第一個(gè)輸出index(0)和第二個(gè)輸出index(1)應(yīng)該是0,第三個(gè)輸出應(yīng)該是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.git
gitcheckoutfouth





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • ARM芯片
    +關(guān)注

    關(guān)注

    1

    文章

    125

    瀏覽量

    21424

原文標(biāo)題:自制深度學(xué)習(xí)推理框架-實(shí)現(xiàn)我們的第一個(gè)算子Relu-第三課

文章出處:【微信號:GiantPandaCV,微信公眾號:GiantPandaCV】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    什么是PRelu算子?PRelu算子調(diào)優(yōu)經(jīng)歷-先行篇

    一個(gè)叫做PRelu的算子,想要運(yùn)行在RT170上。 本來小編是信心滿滿的答應(yīng)客戶說: 速度上放心,我們這主頻1GHz的CPU絕對沒問題,包您滿意。 沒想到跑分結(jié)果出爐直接給了小編沉重一擊。 直接依賴
    的頭像 發(fā)表于 08-24 08:50 ?1301次閱讀
    什么是PRelu<b class='flag-5'>算子</b>?PRelu<b class='flag-5'>算子</b>調(diào)優(yōu)經(jīng)歷-先行篇

    基于GFO算子的圖像增強(qiáng)算法如何去實(shí)現(xiàn)?

    基于GFO算子(廣義模糊算子)的圖像增強(qiáng)算法如何去實(shí)現(xiàn)?怎樣對圖像增強(qiáng)算法進(jìn)行分析?
    發(fā)表于 06-04 06:24

    邊緣檢測的幾種微分算子

    一、邊緣檢測邊緣檢測的幾種微分算子:一階微分算子:Roberts、Sobel、Prewitt二階微分算子:Laplacian、Log/Marr非微分算子:Canny一階微分
    發(fā)表于 07-26 08:29

    bottom-up多層規(guī)約圖融合策略資料介紹

    (例如Conv+ReLU)則受限于供應(yīng)商API的支持程度?! ‰S著AI模型在各領(lǐng)域的發(fā)展、成熟和落地,模型推理在具體設(shè)備上的性能變得越發(fā)重要,17年到18年,業(yè)界出現(xiàn)了大量面向DL模型推理的計(jì)算框架,算子
    發(fā)表于 11-09 17:33

    LOG算子在FPGA中的實(shí)現(xiàn)

    介紹了一種高斯拉普拉斯LOG算子在FPGA中的實(shí)現(xiàn)方案!并通過對一幅BMP圖像的處理!論證了在FPGA中實(shí)現(xiàn)的LOG算子的圖像增強(qiáng)效果
    發(fā)表于 05-16 17:12 ?50次下載
    LOG<b class='flag-5'>算子</b>在FPGA中的實(shí)現(xiàn)

    邊緣檢測算子在汽車牌照區(qū)域檢測中的應(yīng)用

    文中介紹了常用的幾種 邊緣檢測 算子,不同的微分算子對不同邊緣檢測的敏感程度是不同的,因此對不同類型的邊緣提取,應(yīng)該采用對此類邊緣敏感的算子進(jìn)行邊緣提取。針對車輛牌
    發(fā)表于 07-25 16:13 ?22次下載
    邊緣檢測<b class='flag-5'>算子</b>在汽車牌照區(qū)域檢測中的應(yīng)用

    基于修正的直覺模糊集成算子

    已有的一些直覺模糊集成算子在處理一些特殊直覺模糊數(shù)時(shí)會出現(xiàn)反直覺現(xiàn)象。首先介紹了兩個(gè)直覺模糊集成算子和直覺模糊數(shù)的比較方法。接著,舉例說明了這些集成算子在某些情況下出現(xiàn)的反直覺現(xiàn)象。然
    發(fā)表于 11-17 14:36 ?9次下載

    深度ReLU網(wǎng)絡(luò)的訓(xùn)練動態(tài)過程及其對泛化能力的影響

    基于這個(gè)框架,我們試圖用統(tǒng)一的觀點(diǎn)來解釋這些令人費(fèi)解的經(jīng)驗(yàn)現(xiàn)象。本文使用師生設(shè)置,其中給過度參數(shù)化的深度學(xué)生ReLU網(wǎng)絡(luò)的標(biāo)簽,是具有相同深度和未知權(quán)重的固定教師ReLU網(wǎng)絡(luò)的輸出(圖1(a))。在這個(gè)角度來看,隱藏的學(xué)生節(jié)點(diǎn)將隨機(jī)初始化為不同的激活區(qū)域。(圖2(a))
    的頭像 發(fā)表于 06-15 10:48 ?3317次閱讀
    深度<b class='flag-5'>ReLU</b>網(wǎng)絡(luò)的訓(xùn)練動態(tài)過程及其對泛化能力的影響

    在PyTorch中使用ReLU激活函數(shù)的例子

    PyTorch已為我們實(shí)現(xiàn)了大多數(shù)常用的非線性激活函數(shù),我們可以像使用任何其他的層那樣使用它們。讓我們快速看一個(gè)在PyTorch中使用ReLU激活函數(shù)的例子:
    的頭像 發(fā)表于 07-06 15:27 ?2471次閱讀

    Sobel算子原理介紹與實(shí)現(xiàn)方法

    索貝爾算子(Sobel operator)主要用作邊緣檢測,在技術(shù)上,它是一離散性差分算子,用來運(yùn)算圖像亮度函數(shù)的灰度之近似值。在圖像的任何一點(diǎn)使用此算子,將會產(chǎn)生對應(yīng)的灰度矢量或是其法矢量Sobel 卷積因子為:
    的頭像 發(fā)表于 07-21 17:27 ?1.3w次閱讀

    自定義算子開發(fā)

    一個(gè)完整的自定義算子應(yīng)用過程包括注冊算子算子實(shí)現(xiàn)、含自定義算子模型轉(zhuǎn)換和運(yùn)行含自定義op模型四個(gè)階段。在大多數(shù)情況下,您的模型應(yīng)該可以通過使用hb_mapper工具完成轉(zhuǎn)換并順利部署
    的頭像 發(fā)表于 04-07 16:11 ?2715次閱讀
    自定義<b class='flag-5'>算子</b>開發(fā)

    深度ReLU網(wǎng)絡(luò)的對應(yīng)淺層網(wǎng)絡(luò)

    ? 只要你用了ReLU,我們就是好朋就是“淺度學(xué)習(xí)”。 最近有研究證明,所有基于ReLU的深度神經(jīng)網(wǎng)絡(luò)都可以重寫為功能相同的3層神經(jīng)網(wǎng)絡(luò)。 ? 基于這個(gè)證明,倫敦國王學(xué)院的研究團(tuán)隊(duì)還提出一種為任意
    的頭像 發(fā)表于 07-03 14:13 ?524次閱讀
    深度<b class='flag-5'>ReLU</b>網(wǎng)絡(luò)的對應(yīng)淺層網(wǎng)絡(luò)

    機(jī)器學(xué)習(xí)算法的5種基本算子

    自主決策的方法和插件,其中包含了一系列常用的基本算子。在本文中,我們將會介紹機(jī)器學(xué)習(xí)算法的五種基本算子。 一、 求值算子 求值算子是常用的機(jī)
    的頭像 發(fā)表于 08-17 16:11 ?1720次閱讀

    Dynamic ReLU:根據(jù)輸入動態(tài)確定的ReLU

    這是我最近才看到的一篇論文,它提出了動態(tài)ReLU (Dynamic ReLU, DY-ReLU),可以將全局上下文編碼為超函數(shù),并相應(yīng)地調(diào)整分段線性激活函數(shù)。
    的頭像 發(fā)表于 09-01 17:28 ?658次閱讀
    Dynamic <b class='flag-5'>ReLU</b>:根據(jù)輸入動態(tài)確定的<b class='flag-5'>ReLU</b>

    圖像銳化的Sobel、Laplacian算子基礎(chǔ)知識介紹

    Sobel 算子是一種用于邊緣檢測的離散微分算子,它結(jié)合了高斯平滑和微分求導(dǎo)
    的頭像 發(fā)表于 09-13 09:52 ?1233次閱讀
    圖像銳化的Sobel、Laplacian<b class='flag-5'>算子</b>基礎(chǔ)知識<b class='flag-5'>介紹</b>