女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

Max Pooling算子的設(shè)計(jì)實(shí)現(xiàn)

jf_pmFSk4VX ? 來源:GiantPandaCV ? 2023-01-10 09:51 ? 次閱讀

Max Pooling算子的定義

池化層在深度學(xué)習(xí)網(wǎng)絡(luò)中的作用一般是用來緩解卷積層對(duì)位置的過度敏感性。池化層每次對(duì)輸入數(shù)據(jù)的一個(gè)固定形狀窗口(池化窗口的大小為pooling height, pooling width)中的元素計(jì)算輸出,池化層直接計(jì)算池化窗口內(nèi)元素的最大值或者平均值,因此該運(yùn)算也分別叫做最大池化或平均池化。

在我們本節(jié)課要講的二維最大池化中,池化窗口從輸入數(shù)組的最左上方開始,按從左往右、從上往下的順序,依次在輸入數(shù)組上滑動(dòng)(滑動(dòng)的幅度被稱為stride)。當(dāng)池化窗口滑動(dòng)到某一位置時(shí),窗口中的輸入子數(shù)組的最大值即輸出數(shù)組中相應(yīng)位置的元素。

01ff34bc-9034-11ed-bfe3-dac502259ad0.png

圖1展示了池化窗口形狀為 2×2 的最大池化,陰影部分為第一個(gè)輸出元素及其計(jì)算所使用的輸入元素。

輸出數(shù)組的高和寬分別為2,其中的4個(gè)元素由取最大值運(yùn)算 max 得出。 如下公式所示,池化操作的步驟依次為從左到右,從上到下,每次向下移動(dòng)的步長(zhǎng)為stride height, 向右移動(dòng)的步長(zhǎng)為stride width. 進(jìn)行池化操作元素的數(shù)量由pooling height和pooling width所組成的2×2的窗口所決定。

Max Pooling Operator的實(shí)現(xiàn)

classMaxPoolingOp:publicOperator{
public:
explicitMaxPoolingOp(uint32_tpooling_h,uint32_tpooling_w,uint32_tstride_h,
uint32_tstride_w,uint32_tpadding_h,uint32_tpadding_w);

voidset_pooling_h(uint32_tpooling_height);
voidset_pooling_w(uint32_tpooling_width);

voidset_stride_w(uint32_tstride_width);
voidset_stride_h(uint32_tstride_height);

voidset_padding_h(uint32_tpadding_height);
voidset_padding_w(uint32_tpadding_width);

uint32_tpadding_height()const;
uint32_tpadding_width()const;

uint32_tstride_width()const;
uint32_tstride_height()const;

uint32_tpooling_height()const;
uint32_tpooling_width()const;
private:
uint32_tpooling_h_;//池化核高度大小
uint32_tpooling_w_;//池化核寬度大小
uint32_tstride_h_;//高度上的步長(zhǎng)
uint32_tstride_w_;//寬度上的步長(zhǎng)
uint32_tpadding_h_;//高度上的填充
uint32_tpadding_w_;//寬度上的填充
};

可以看到如上的Operator中,有6個(gè)類內(nèi)屬性,分別對(duì)應(yīng)著我們第一節(jié)中講過的步長(zhǎng)(stride), 池化核(pooling)以及在池化前對(duì)邊緣的擴(kuò)充,以下我們?cè)诜謩e講講:

stride: 池化核每次移動(dòng)的步長(zhǎng)

pooling: 池化核的大小

padding: 對(duì)輸入特征圖的邊緣擴(kuò)充

如下圖2是pad(padding值為1)后輸入特征圖的池化操作(池化核為2):

020e0816-9034-11ed-bfe3-dac502259ad0.png

Max Pooling Layer的實(shí)現(xiàn)

MaxPoolingLayer::MaxPoolingLayer(conststd::shared_ptr&op):Layer("maxpooling"){
CHECK(op->op_type_==OpType::kOperatorMaxPooling)<op_type_);
MaxPoolingOp*max_pooling_op=dynamic_cast(op.get());

CHECK(max_pooling_op!=nullptr)<op_=std::make_unique(*max_pooling_op);
}

voidMaxPoolingLayer::Forwards(conststd::vector>>&inputs,
std::vector>>&outputs){
CHECK(this->op_!=nullptr);
CHECK(this->op_->op_type_==OpType::kOperatorMaxPooling);
CHECK(!inputs.empty());
constuint32_tpadding_h=this->op_->padding_height();
constuint32_tpadding_w=this->op_->padding_width();
constuint32_tkernel_h=this->op_->pooling_height();
constuint32_tkernel_w=this->op_->pooling_width();
constuint32_tstride_h=this->op_->stride_height();
constuint32_tstride_w=this->op_->stride_width();

constuint32_tbatch_size=inputs.size();
for(uint32_ti=0;i>&input_data_=inputs.at(i)->Clone();
input_data_->Padding({padding_h,padding_h,padding_w,padding_w},std::numeric_limits::lowest());
constuint32_tinput_h=input_data_->rows();
constuint32_tinput_w=input_data_->cols();
constuint32_tinput_c=input_data_->channels();
constuint32_toutput_c=input_c;

constuint32_toutput_h=uint32_t(std::floor((input_h-kernel_h)/stride_h+1));
constuint32_toutput_w=uint32_t(std::floor((input_w-kernel_w)/stride_w+1));
CHECK(output_w>0&&output_h>0);

std::shared_ptr>output_data=std::make_shared>(output_c,output_h,output_w);
for(uint32_tic=0;icat(ic);
arma::fmat&output_channel=output_data->at(ic);
for(uint32_tr=0;rMaxPoolingLayer::CreateInstance(conststd::shared_ptr&op){
CHECK(op->op_type_==OpType::kOperatorMaxPooling);
std::shared_ptrmax_layer=std::make_sh了ared(op);
returnmax_layer;
}

LayerRegistererWrapperkMaxPoolingLayer(OpType::kOperatorMaxPooling,MaxPoolingLayer::CreateInstance);
voidMaxPoolingLayer::Forwards(conststd::vector>>&inputs,
std::vector>>&outputs){
CHECK(this->op_!=nullptr);
CHECK(this->op_->op_type_==OpType::kOperatorMaxPooling);
CHECK(!inputs.empty());
}

我們重點(diǎn)來看Forwards函數(shù), 首先判斷輸入是否為空并獲得池化操作相關(guān)的屬性值(原本存放在op中).

計(jì)算池化后的輸出特征圖大小, 公式為:

for(uint32_ti=0;i>&input_data_=inputs.at(i)->Clone();
input_data_->Padding({padding_h,padding_h,padding_w,padding_w},std::numeric_limits::lowest());

如上的過程表示對(duì)輸入的特征圖四周進(jìn)行填充,填充的大小由于padding_w和padding_h決定。這兩個(gè)Layer計(jì)算時(shí)候的屬性由op中得到,也就是說padding_w和padding_h存放在this->op中, this->op_ = std::make_unique(*max_pooling_op);

for(uint32_ti=0;i>&input_data_=inputs.at(i)->Clone();
input_data_->Padding({padding_h,padding_h,padding_w,padding_w},std::numeric_limits::lowest());
constuint32_tinput_h=input_data_->rows();
constuint32_tinput_w=input_data_->cols();
constuint32_tinput_c=input_data_->channels();
constuint32_toutput_c=input_c;

constuint32_toutput_h=uint32_t(std::floor((input_h-kernel_h)/stride_h+1));
constuint32_toutput_w=uint32_t(std::floor((input_w-kernel_w)/stride_w+1));
CHECK(output_w>0&&output_h>0);

如上的過程表示根據(jù)輸入的特征圖大小input_h和input_w來計(jì)算對(duì)應(yīng)的輸出特征值大小output_h和output_w. 計(jì)算的公式如上文所示。如果輸入的特征數(shù)據(jù)input_data_有填充,則根據(jù)填充數(shù)據(jù)的輸入大小來計(jì)算對(duì)應(yīng)的輸出大小。

for(uint32_ti=0;iat(ic);
arma::fmat&output_channel=output_data->at(ic);
for(uint32_tr=0;r

for(uint32_t ic =0; ic < input_c;++ic) 表示對(duì)輸入的特征圖進(jìn)行逐通道的池化操作, 設(shè)當(dāng)前進(jìn)行操作的輸入特征圖通道為input_channel, 池化后的輸出特征圖放置于output_channel中。池化的過程如下公式所描述:

在上述的代碼中region表示當(dāng)前輸入特征數(shù)據(jù)需要進(jìn)行池化的部分,對(duì)應(yīng)于公式中[r:r+kernel height -1,c:c+kernel width -1]

中的數(shù)據(jù)。輸入特征的數(shù)據(jù)是逐個(gè)通道進(jìn)行處理(池化操作)的,從ic = 0到ic = input_channel - 1, 當(dāng)前池化的數(shù)據(jù)保存在region中。

input_channel.submat(r, c, r + kernel_h -1, c + kernel_w -1)取得一個(gè)池化區(qū)域內(nèi)的所有元素,隨后使用region.max()取得區(qū)域內(nèi)(kernel_h和kernel_w組成的范圍)的最大值, 并且每次區(qū)域移動(dòng)的位置是stride_h和stride_w, 取得最大值后存放在輸出特征圖中對(duì)應(yīng)的位置中,輸出存放的位置為輸出特征圖outut_channel的(int(r/stride_h),int(c/stride_w))的位置中。這部分可能描述地比較晦澀,請(qǐng)結(jié)合視頻一起食用。

Max Pooling Layer的其他部分

MaxPoolingLayer::MaxPoolingLayer(conststd::shared_ptr&op):Layer("maxpooling"){
CHECK(op->op_type_==OpType::kOperatorMaxPooling)<op_type_);
MaxPoolingOp*max_pooling_op=dynamic_cast(op.get());

CHECK(max_pooling_op!=nullptr)<op_=std::make_unique(*max_pooling_op);
}

LayerRegistererWrapperkMaxPoolingLayer(OpType::kOperatorMaxPooling,MaxPoolingLayer::CreateInstance);

以上的步驟完成了Max Pooling層的注冊(cè), 具體流程已經(jīng)在第五節(jié)中講過。MaxPoolingLayer::MaxPoolingLayer初始化部分根據(jù)傳入的op對(duì)this->op_進(jìn)行賦值,this->op_中保存了stride,padding,pooling等計(jì)算時(shí)需要的屬性信息。

單元測(cè)試

TEST(test_layer,forward_maxpooling1){
usingnamespacekuiper_infer;
uint32_tstride_h=1;
uint32_tstride_w=1;
uint32_tpadding_h=0;
uint32_tpadding_w=0;
uint32_tpooling_h=2;
uint32_tpooling_w=2;

std::shared_ptr
max_op=std::make_shared(pooling_h,pooling_w,stride_h,stride_w,padding_h,padding_w);
std::shared_ptrmax_layer=LayerRegisterer::CreateLayer(max_op);
CHECK(max_layer!=nullptr);

arma::fmatinput_data="012;"
"345;"
"678;";
std::shared_ptr>input=std::make_shared>(2,input_data.n_rows,input_data.n_cols);
input->at(0)=input_data;
input->at(1)=input_data;

std::vector>>inputs;
std::vector>>outputs;
inputs.push_back(input);

max_layer->Forwards(inputs,outputs);
ASSERT_EQ(outputs.size(),1);
constauto&output=outputs.at(0);
LOG(INFO)<data();
ASSERT_EQ(output->rows(),2);
ASSERT_EQ(output->cols(),2);

ASSERT_EQ(output->at(0,0,0),4);
ASSERT_EQ(output->at(0,0,1),5);
ASSERT_EQ(output->at(0,1,0),7);
ASSERT_EQ(output->at(0,1,1),8);

ASSERT_EQ(output->at(1,0,0),4);
ASSERT_EQ(output->at(1,0,1),5);
ASSERT_EQ(output->at(1,1,0),7);
ASSERT_EQ(output->at(1,1,1),8);
}

可以看到, 我們的輸入為 arma::fmat input_data ="0 1 2 ; 3 4 5 ;6 7 8; " , 池化核的大小為2, 每次移動(dòng)的步長(zhǎng)stride =1,所以根據(jù)我們?cè)诘谝还?jié)中的計(jì)算, 最后的輸出特征圖大小應(yīng)該是2乘2大小, 池化得到的值分別為4 5 7 8.

021f7632-9034-11ed-bfe3-dac502259ad0.png






審核編輯:劉清

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

    關(guān)注

    6

    文章

    361

    瀏覽量

    42439

原文標(biāo)題:自制深度學(xué)習(xí)推理框架-第六課-Max Pooling算子的實(shí)現(xiàn)

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    零知開源——STM32F4驅(qū)動(dòng)MAX31865實(shí)現(xiàn)PT100高精度測(cè)溫

    ? 簡(jiǎn)介本教程基于零知增強(qiáng)板(主控芯片STM32F407VET6),演示如何通過MAX31865模塊讀取三線制PT100鉑電阻溫度,并通過I2C OLED實(shí)時(shí)顯示溫度值和電阻值。重點(diǎn)包含硬件接線配置
    發(fā)表于 05-26 18:52

    max31865測(cè)溫跳變大

    pt100和max31865測(cè)室溫跳變比較大,會(huì)從23.04跳到23.47,23.75反復(fù)跳變超過了0.5的誤差范圍,在VDD和GND之間加上0.1和10的濾波電容也不行,該怎么解決
    發(fā)表于 04-30 23:34

    MAX38913AEVK-WLP: Evaluation Kit for the MAX38913 and MAX38914 Data Sheet adi

    電子發(fā)燒友網(wǎng)為你提供ADI(ADI)MAX38913AEVK-WLP: Evaluation Kit for the MAX38913 and MAX38914 Data Sheet相關(guān)產(chǎn)品參數(shù)
    發(fā)表于 01-15 18:55
    <b class='flag-5'>MAX</b>38913AEVK-WLP: Evaluation Kit for the <b class='flag-5'>MAX</b>38913 and <b class='flag-5'>MAX</b>38914 Data Sheet adi

    MAX98360AEVSYS-FCQFN-MAX98360DEVSYS-FCQFN: Evaluation Systems for the MAX98360A/MAX98360B/MAX98360C/MAX98360D Data Sheet adi

    電子發(fā)燒友網(wǎng)為你提供ADI(ADI)MAX98360AEVSYS-FCQFN-MAX98360DEVSYS-FCQFN: Evaluation Systems for the MAX
    發(fā)表于 01-15 18:46
    <b class='flag-5'>MAX98360AEVSYS-FCQFN-MAX</b>98360DEVSYS-FCQFN: Evaluation Systems for the <b class='flag-5'>MAX</b>98360A/<b class='flag-5'>MAX</b>98360B/<b class='flag-5'>MAX</b>98360C/<b class='flag-5'>MAX</b>98360D Data Sheet adi

    MAX3221 INVALID為什么一直都是低電平?

    最近在使用MAX3221實(shí)現(xiàn)如此功能,首先可以作為串口轉(zhuǎn)換芯片使用,另外當(dāng)接收到RS232信號(hào)時(shí),INVALID要求輸出高電平,當(dāng)沒有RS232信號(hào)時(shí),INVALID要求輸出低電平,現(xiàn)在的問題是INVALID一直都是低電平,電路圖都是按照設(shè)計(jì)要求畫的,請(qǐng)問這是什么原因啊
    發(fā)表于 12-31 06:40

    用來代替MAX14930DAWE+有哪些?

    您好!選用ISO7340-Q1時(shí),在DATASHEET上面看到不同后綴的型號(hào),我想選的是輸出默認(rèn)為低電平,在數(shù)據(jù)手冊(cè)上沒有找到相關(guān)說明。用來代替MAX14930DAWE+.希望推薦型號(hào)
    發(fā)表于 12-25 07:49

    MAX44290ANT+T和MAX44290ANT+TG7有什么區(qū)別呢?

    MAX44290ANT+T和MAX44290ANT+TG7請(qǐng)問有什么區(qū)別呢? 是否有文件呢 謝謝
    發(fā)表于 12-19 07:17

    MAX232實(shí)現(xiàn)單電源供電下放大3.3Vpp方波?

    請(qǐng)問大佬,可以通過MAX232實(shí)現(xiàn)單電源5V供電下,把40KHZ,3.3Vpp的方波放大到多少?怎么實(shí)現(xiàn)呢?(老師提示是用H橋和MAX轉(zhuǎn)換電路)
    發(fā)表于 11-04 20:08

    大佬們求助!!!max2082超聲

    max2082超聲芯片有沒有可以替代的便宜一點(diǎn)的; 現(xiàn)在需要做超聲的東西,但是這個(gè)芯片有點(diǎn)貴,想找個(gè)便宜的,可以降一下性能,或者有沒有國(guó)產(chǎn)的。 求助各位!!
    發(fā)表于 09-25 17:45

    基于 DSP5509 進(jìn)行數(shù)字圖像處理中 Sobel 算子邊緣檢測(cè)的硬件連接電路圖

    以下是基于 DSP5509 進(jìn)行數(shù)字圖像處理中 Sobel 算子邊緣檢測(cè)的硬件設(shè)計(jì)方案: 一、總體架構(gòu) 圖像采集:使用合適的圖像傳感器,如 CMOS 傳感器,通過相應(yīng)的接口(如 SPI、I2C 等
    發(fā)表于 09-25 15:25

    摩爾線程攜手智源研究院完成基于Triton的大模型算子庫適配

    里,即成功完成了近60個(gè)算子的功能驗(yàn)證,精度符合交付標(biāo)準(zhǔn),并實(shí)現(xiàn)對(duì)Bert-large模型的全面支持。FlagGems算子庫在摩爾線程MUSA架構(gòu)上展現(xiàn)出了接近手寫算子的計(jì)算性能,且性
    的頭像 發(fā)表于 08-02 11:06 ?1286次閱讀

    ZN-Z84,能ping通,但是NI MAX不識(shí)別,找不到設(shè)備

    前提是,安裝原廠的user程序,利用usb驅(qū)動(dòng)和接口,是可以實(shí)現(xiàn)程控通信的。 ZN-Z84,開關(guān)單元,利用網(wǎng)線連接,結(jié)果IP 都用cmd的ping 命令ping通了,死活都無法在NI MAX 和IO
    發(fā)表于 08-02 09:08

    ZN-Z84,能ping通,但是NI MAX不識(shí)別,找不到設(shè)備

    前提是,安裝原廠的user程序,利用usb驅(qū)動(dòng)和接口,是可以實(shí)現(xiàn)程控通信的。 ZN-Z84,開關(guān)單元,利用網(wǎng)線連接,結(jié)果IP 都用cmd的ping 命令ping通了,死活都無法在NI MAX 和IO
    發(fā)表于 07-27 10:18

    max11284的REF基準(zhǔn)輸入是基于AVSS嗎?

    max11284 的REF基準(zhǔn)輸入是基于AVSS嗎?我看EVKIT中當(dāng)J2_A,J23_A的2、3腳跳選時(shí),此時(shí)AVDD-AVSS輸入為+-1.8V。此時(shí)采用板上基準(zhǔn)芯片MAX
    發(fā)表于 07-23 06:55

    ClickHouse內(nèi)幕(3)基于索引的查詢優(yōu)化

    ClickHouse索引采用唯一聚簇索引的方式,即Part內(nèi)數(shù)據(jù)按照order by keys有序,在整個(gè)查詢計(jì)劃中,如果算子能夠有效利用輸入數(shù)據(jù)的有序性,對(duì)算子的執(zhí)行性能將有巨大的提升。本文討論
    的頭像 發(fā)表于 06-11 10:46 ?1277次閱讀
    ClickHouse內(nèi)幕(3)基于索引的查詢優(yōu)化