精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Relu算子的介紹

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

Relu算子的介紹

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

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

Operator類

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;
};

Layer類

我們會在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.git
gitcheckoutfouth





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • ARM芯片
    +關注

    關注

    1

    文章

    125

    瀏覽量

    21443

原文標題:自制深度學習推理框架-實現我們的第一個算子Relu-第三課

文章出處:【微信號:GiantPandaCV,微信公眾號:GiantPandaCV】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    什么是PRelu算子?PRelu算子調優經歷-先行篇

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

    基于GFO算子的圖像增強算法如何去實現?

    基于GFO算子(廣義模糊算子)的圖像增強算法如何去實現?怎樣對圖像增強算法進行分析?
    發表于 06-04 06:24

    邊緣檢測的幾種微分算子

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

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

    (例如Conv+ReLU)則受限于供應商API的支持程度。  隨著AI模型在各領域的發展、成熟和落地,模型推理在具體設備上的性能變得越發重要,17年到18年,業界出現了大量面向DL模型推理的計算框架,算子
    發表于 11-09 17:33

    LOG算子在FPGA中的實現

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

    邊緣檢測算子在汽車牌照區域檢測中的應用

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

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

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

    深度ReLU網絡的訓練動態過程及其對泛化能力的影響

    基于這個框架,我們試圖用統一的觀點來解釋這些令人費解的經驗現象。本文使用師生設置,其中給過度參數化的深度學生ReLU網絡的標簽,是具有相同深度和未知權重的固定教師ReLU網絡的輸出(圖1(a))。在這個角度來看,隱藏的學生節點將隨機初始化為不同的激活區域。(圖2(a))
    的頭像 發表于 06-15 10:48 ?3332次閱讀
    深度<b class='flag-5'>ReLU</b>網絡的訓練動態過程及其對泛化能力的影響

    在PyTorch中使用ReLU激活函數的例子

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

    Sobel算子原理介紹與實現方法

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

    自定義算子開發

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

    深度ReLU網絡的對應淺層網絡

    ? 只要你用了ReLU,我們就是好朋就是“淺度學習”。 最近有研究證明,所有基于ReLU的深度神經網絡都可以重寫為功能相同的3層神經網絡。 ? 基于這個證明,倫敦國王學院的研究團隊還提出一種為任意
    的頭像 發表于 07-03 14:13 ?531次閱讀
    深度<b class='flag-5'>ReLU</b>網絡的對應淺層網絡

    機器學習算法的5種基本算子

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

    Dynamic ReLU:根據輸入動態確定的ReLU

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

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

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