chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

Max Pooling算子的設計實現(xiàn)

jf_pmFSk4VX ? 來源:GiantPandaCV ? 2023-01-10 09:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Max Pooling算子的定義

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

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

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

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

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

Max Pooling Operator的實現(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_;//高度上的步長
uint32_tstride_w_;//寬度上的步長
uint32_tpadding_h_;//高度上的填充
uint32_tpadding_w_;//寬度上的填充
};

可以看到如上的Operator中,有6個類內(nèi)屬性,分別對應著我們第一節(jié)中講過的步長(stride), 池化核(pooling)以及在池化前對邊緣的擴充,以下我們在分別講講:

stride: 池化核每次移動的步長

pooling: 池化核的大小

padding: 對輸入特征圖的邊緣擴充

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

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

Max Pooling Layer的實現(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());
}

我們重點來看Forwards函數(shù), 首先判斷輸入是否為空并獲得池化操作相關的屬性值(原本存放在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());

如上的過程表示對輸入的特征圖四周進行填充,填充的大小由于padding_w和padding_h決定。這兩個Layer計算時候的屬性由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來計算對應的輸出特征值大小output_h和output_w. 計算的公式如上文所示。如果輸入的特征數(shù)據(jù)input_data_有填充,則根據(jù)填充數(shù)據(jù)的輸入大小來計算對應的輸出大小。

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) 表示對輸入的特征圖進行逐通道的池化操作, 設當前進行操作的輸入特征圖通道為input_channel, 池化后的輸出特征圖放置于output_channel中。池化的過程如下公式所描述:

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

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

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

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層的注冊, 具體流程已經(jīng)在第五節(jié)中講過。MaxPoolingLayer::MaxPoolingLayer初始化部分根據(jù)傳入的op對this->op_進行賦值,this->op_中保存了stride,padding,pooling等計算時需要的屬性信息。

單元測試

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, 每次移動的步長stride =1,所以根據(jù)我們在第一節(jié)中的計算, 最后的輸出特征圖大小應該是2乘2大小, 池化得到的值分別為4 5 7 8.

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






審核編輯:劉清

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

    關注

    6

    文章

    361

    瀏覽量

    43131

原文標題:自制深度學習推理框架-第六課-Max Pooling算子的實現(xiàn)

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    MAX2769ETI是否可以替換MAX2771ETI的問題

    MAX2769ETI 是業(yè)界第一款通用的單芯片全球?qū)Ш叫l(wèi)星系統(tǒng)(GNSS)接收機,用于 GPS、GLONASS 以及伽利略導航衛(wèi)星系統(tǒng)。它采用與 MAX2771ETI 相同的先進低功率 SiGe
    發(fā)表于 09-29 13:45

    深入解析面向不同市場的多樣化Arm計算子系統(tǒng)

    如果你曾基于 Arm 技術開發(fā)過產(chǎn)品,很大機會已經(jīng)感受到了 Arm 計算子系統(tǒng) (Arm Compute Subsystems, Arm CSS) 所帶來的強勁性能。
    的頭像 發(fā)表于 09-06 14:09 ?807次閱讀
    深入解析面向不同市場的多樣化Arm計<b class='flag-5'>算子</b>系統(tǒng)

    GraniStudio:獲取軸信息例程

    導入。 2.功能說明 實現(xiàn)位置3個軸的狀態(tài)讀取以及將位置存儲反饋到 HMI 上。 2.1通過初始化 運控板卡 算子連接 格拉尼總線 型運控卡,導入工程自動進行連接,此算子為使用運控控制板卡的第一項操作,后續(xù)運控
    的頭像 發(fā)表于 08-22 16:40 ?501次閱讀
    GraniStudio:獲取軸信息例程

    一鍵開關機芯片GEK100,替代 ADI 的 MAX16169和MAX16054

    ,常常需要多個電源輸出以滿足不同模塊的供電需求。MAX16169 僅提供單路輸出,在面對一些復雜電路時,往往需要額外添加電路來實現(xiàn)多路供電,這不僅增加了成本,還可能引入新的故障點。?GEK100 芯片則
    發(fā)表于 08-15 17:32

    MAX1969EUI的電流方向從始終從OS1流向OS2?

    1、MAX1969EUI的電流方向從始終從OS1流向OS2? 2、那是否意味著OS1接TEC+,OS2接TEC-來實現(xiàn)制冷? 3、同時CTLI需要給0~1.5V的電壓來實現(xiàn)制冷?
    發(fā)表于 08-07 06:05

    西門子 Veloce CS 助力 Arm Neoverse 計算子系統(tǒng)驗證與確認

    西門子數(shù)字化工業(yè)軟件近日宣布,Veloce Strato CS 與Veloce proFPGA CS 已被 Veloce 的長期合作伙伴 Arm 部署應用,作為Arm Neoverse 計算子
    的頭像 發(fā)表于 08-06 09:26 ?2547次閱讀

    進迭時空同構融合RISC-V AI CPU的Triton算子編譯器實踐

    Pytorch已能做到100%替換CUDA,國內(nèi)也有智源研究院主導的FlagGems通用算子庫試圖構建起不依賴CUDA的AI計算生態(tài),截至今日,F(xiàn)lagGems已進入Pyto
    的頭像 發(fā)表于 07-15 09:04 ?1358次閱讀
    進迭時空同構融合RISC-V AI CPU的Triton<b class='flag-5'>算子</b>編譯器實踐

    MAX9259/MAX9260多媒體串行鏈路,提供擴頻功能和全雙工控制通道技術手冊

    MAX9259/MAX9260芯片組采用Maxim吉比特多媒體串行鏈路(GMSL)技術。MAX9259串行器與MAX9260解串器配合使用,構成完整的數(shù)字串行鏈路,
    的頭像 發(fā)表于 05-28 16:57 ?778次閱讀
    <b class='flag-5'>MAX</b>9259/<b class='flag-5'>MAX</b>9260多媒體串行鏈路,提供擴頻功能和全雙工控制通道技術手冊

    零知開源——STM32F4驅(qū)動MAX31865實現(xiàn)PT100高精度測溫

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

    max31865測溫跳變大

    pt100和max31865測室溫跳變比較大,會從23.04跳到23.47,23.75反復跳變超過了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相關產(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實現(xiàn)如此功能,首先可以作為串口轉(zhuǎn)換芯片使用,另外當接收到RS232信號時,INVALID要求輸出高電平,當沒有RS232信號時,INVALID要求輸出低電平,現(xiàn)在的問題是INVALID一直都是低電平,電路圖都是按照設計要求畫的,請問這是什么原因啊
    發(fā)表于 12-31 06:40

    用來代替MAX14930DAWE+有哪些?

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

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

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