在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

結合卷積層來創建一個完整的推理函數

OpenFPGA ? 來源:OpenFPGA ? 2023-03-13 09:22 ? 次閱讀

到上一篇為止,我們已經完成了卷積層、全連接層、池化層、激活函數ReLU的所有C的編程實現。在本文中,我們將結合這些層來創建一個完整的推理函數。

模型實現

下面是在第 2 篇文章中創建的推理模型的圖表。

8eefb56e-c01c-11ed-bfe3-dac502259ad0.png

首先輸入一張1x28x28的圖片,然后兩次通過Conv2d -> ReLU -> MaxPool2d提取特征,最后轉為linear,> ReLU -> Linear為10階向量值。

用C寫的時候,只需按如下依次逐層處理即可。

voidconv2d(constfloat*x,constfloat*weight,constfloat*bias,int32_twidth,int32_theight,
int32_tin_channels,int32_tout_channels,int32_tksize,float*y){
for(int32_toch=0;och=height||pw=width){
continue;
}

int64_tpix_idx=(ich*height+ph)*width+pw;
int64_tweight_idx=((och*in_channels+ich)*ksize+kh)*ksize+kw;

sum+=x[pix_idx]*weight[weight_idx];
}
}
}

//addbias
sum+=bias[och];

y[(och*height+h)*width+w]=sum;
}
}
}
}

函數內部的緩沖區 (x1-x8) 用于連接各層之間的特征數據。

在HLS中,在哪里定義這個buffer很重要,如果像這次一樣把它放在函數中,就可以指定使用FPGA中的RAM(或寄存器)。

另一方面,如果將此緩沖區作為函數的參數提供,則可以將數據連接到外部 DRAM。這個區域需要根據應用來設計,但是這次內部SRAM已經夠用了,所以定義在函數內部。

如果像以前一樣編寫接口規范,將如下所示:

輸入

x: 輸入圖像。shape=(1, 28, 28)

weight0:第一個卷積層的權重。shape=(4, 1, 3, 3)

bias0:第一個卷積層的偏差。shape=(4)

weight1:第二個卷積層的權重。shape=(8, 4, 3, 3)

bias1:第二個卷積層的偏差。shape=(8)

weight2:第一個全連接層的權重。shape=(32, 8 * 7 * 7)

bias2:第一個全連接層的偏差。shape=(32)

weight3:第二個全連接層的權重。shape=(10, 32)

bias3:第二個全連接層的偏差。shape=(10)

輸出

y:輸出向量。shape=(10)

界面設置

在目前創建的函數中,我們還沒有具體定義創建電路的接口。未指定接口時,HLS 會為簡單 SRAM 生成一個接口。

該接口不能用于訪問DRAM等訪問時間不確定的接口,不方便在真機上操作。為此,我們告訴HLS使用一種稱為AMBA AXI4接口協議(以下簡稱AXI)的協議,該協議主要用于Xilinx FPGA上IP之間的接口。

簡單介紹一下AXI,AXI是ARM公司提供的一種接口標準。

Xilinx IP主要使用以下三種協議。

AXI4:高速內存訪問協議(主要用途:訪問DRAM、PCIe等)

AXI4-Lite:AXI4的一個子集,一種用于低速內存訪問的協議(主要用途:IP寄存器控制)

AXI4-Stream:僅用于單向數據傳輸的協議,無地址(主要用途:流數據處理)

這次我們將使用 AXI4 訪問輸入/輸出數據,使用 AXI4-Lite 控制 IP。

具有接口定義的推理函數如下所示:

voidinference_top(constfloatx[kMaxSize],
constfloatweight0[kMaxSize],constfloatbias0[kMaxSize],
constfloatweight1[kMaxSize],constfloatbias1[kMaxSize],
constfloatweight2[kMaxSize],constfloatbias2[kMaxSize],
constfloatweight3[kMaxSize],constfloatbias3[kMaxSize],
floaty[kMaxSize]){
#pragmaHLSinterfacem_axiport=xoffset=slavebundle=gmem0
#pragmaHLSinterfacem_axiport=weight0offset=slavebundle=gmem1
#pragmaHLSinterfacem_axiport=weight1offset=slavebundle=gmem2
#pragmaHLSinterfacem_axiport=weight2offset=slavebundle=gmem3
#pragmaHLSinterfacem_axiport=weight3offset=slavebundle=gmem4
#pragmaHLSinterfacem_axiport=bias0offset=slavebundle=gmem5
#pragmaHLSinterfacem_axiport=bias1offset=slavebundle=gmem6
#pragmaHLSinterfacem_axiport=bias2offset=slavebundle=gmem7
#pragmaHLSinterfacem_axiport=bias3offset=slavebundle=gmem8
#pragmaHLSinterfacem_axiport=yoffset=slavebundle=gmem9
#pragmaHLSinterfaces_axiliteport=xbundle=control
#pragmaHLSinterfaces_axiliteport=weight0bundle=control
#pragmaHLSinterfaces_axiliteport=weight1bundle=control
#pragmaHLSinterfaces_axiliteport=weight2bundle=control
#pragmaHLSinterfaces_axiliteport=weight3bundle=control
#pragmaHLSinterfaces_axiliteport=bias0bundle=control
#pragmaHLSinterfaces_axiliteport=bias1bundle=control
#pragmaHLSinterfaces_axiliteport=bias2bundle=control
#pragmaHLSinterfaces_axiliteport=bias3bundle=control
#pragmaHLSinterfaces_axiliteport=ybundle=control
#pragmaHLSinterfaces_axiliteport=returnbundle=control
dnnk::inference(x,
weight0,bias0,
weight1,bias1,
weight2,bias2,
weight3,bias3,
y);
}

dnnk::inference函數就是前面提到的推理函數,這個函數將dnnk::inference“包起來”了。

和上一篇文章一樣,top函數的接口是一個數組,而不是一個指針。在仿真 HLS 時,此符號對于指定仿真器保留的內存緩沖區的大小是必需的,但它并不是很重要。

第 30-50 行 #pragma HLS interfaceport=<參數名稱>bundle=<要分配的接口名稱> 使用語法為每個函數參數指定接口協議,使用的協議有兩個,m_axi和s_axilite,其中m_/s_部分表示請求是發送還是接收(AXI術語中的master/slave),后面的部分就是前面提到的協議部分增加。

在此函數中,每個數據端口都成為 AXI4 主端口并主動從 DRAM (L30-39) 中獲取數據。此時主機CPU等訪問的存儲器地址可以通過AXI4-Lite從端口(L40-49)進行設置。

最后,用于開始處理的控制寄存器和用于檢查處理完成的狀態寄存器port=return鏈接到 AXI4-Lite 從端口 (L50)。

綜合/結果確認

界面

將這個電路作為IP輸出,放到Vivado的IP Integrator中,如下圖。每個端口的名稱對應于上面的interface pragma bundle位置。

8f0edcc8-c01c-11ed-bfe3-dac502259ad0.png

熟悉 Vivado 開發的都知道,剩下要做的就是適當地連接端口,將能夠創建能夠進行推理處理的 FPGA 圖像。

綜合

綜合時的表現如下:執行時間最短 1.775 ms,最長 7.132 ms。

8f287d68-c01c-11ed-bfe3-dac502259ad0.png

在這里,我想知道為什么輸入圖像大小是固定的,但執行時間不固定,這是因為第三篇文章中創建的卷積函數continue包括補零處理。

由于這個補零過程只在屏幕邊緣進行,實際執行時間幾乎是最大時間7.132 ms。

for(int32_tkw=0;kw=height||pw=width){
continue;
}

int64_tpix_idx=(ich*height+ph)*width+pw;
int64_tweight_idx=((och*in_channels+ich)*ksize+kh)*ksize+kw;

sum+=x[pix_idx]*weight[weight_idx];
}

在這里為了可讀性,用continue中止,但是在FPGA上,與在這里中斷循環的處理相比,使用已經安裝的乘法加法器進行0加法運算的成本更少。

資源使用

FPGA的資源利用率如下所示:總體使用量是微不足道的,因為沒有增加并行化和流水線等資源的加速。

8f415f86-c01c-11ed-bfe3-dac502259ad0.png






審核編輯:劉清

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

    關注

    40

    文章

    2316

    瀏覽量

    183570
  • 寄存器
    +關注

    關注

    31

    文章

    5355

    瀏覽量

    120531
  • SRAM芯片
    +關注

    關注

    0

    文章

    65

    瀏覽量

    12107
  • HLS
    HLS
    +關注

    關注

    1

    文章

    129

    瀏覽量

    24134

原文標題:總結

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

收藏 人收藏

    評論

    相關推薦

    函數計算序列線性卷積結果

    定義函數文件,功能是采用重疊相加法完成無限長序列與有限長序列的線性卷積,然后用該函數文件計算序列x[k]=2k+1,0≤k≤18與序列h
    發表于 11-29 13:36

    CNN之卷積

    相乘再求和)的操作就是所謂的『卷積』操作,也是卷積神經網絡的名字來源。非嚴格意義上來講,下圖中紅框框起來的部分便可以理解為濾波器,即帶著
    發表于 10-17 10:15

    卷積神經網絡卷積的處理過程

    。本文就以卷積神經網絡為例談談怎么步優化卷積神經網絡使用的memory。文章(卷積神經
    發表于 12-23 06:16

    【飛凌RK3568開發板試用體驗】RKNN模型推理測試

    MobileNet是Google團隊2017年提出深度學習模型,專注于移動端或者嵌入式設備中的輕量級CNN網絡。模型推理卷積操作占用了大部分的時間,因此MobileNet V1使
    發表于 12-08 19:06

    如何在PyTorch上學習和創建網絡模型呢?

    的網絡模型是卷積神經網絡,該網絡由以下三和激活函數的組合組成。全連接
    發表于 02-21 15:22

    卷積的C++實現詳細介紹

    。第一個三級循環確定輸出圖像上的位置,隨后的三級循環對該位置執行卷積操作。零填充在第 24-26 行完成。由于實際創建零填充輸入圖像是低效的,所以零填充是通過在訪問圖像外部時不參與乘積之和
    發表于 02-24 15:41

    一層卷積能做啥?一層卷積可以做超分嗎?

      Abstract  經典的圖像縮放(比如bicubic)可以視作卷積+上采樣濾波器
    發表于 03-06 14:05

    結合卷積與全連接創建完整推理函數

    連接的偏差。shape=(10)  輸出  y:輸出向量。shape=(10)  界面設置  在目前創建函數中,我們還沒有具體定義創建電路的接口。未指定接口時,HLS 會為簡單 S
    發表于 03-17 16:19

    C語言入門教程-創建函數

    創建函數庫 上述程序中的rand和bubble_sort函數很實用,很可能在您寫其他程序時也能派上用場。為了能更方便地重復使用,您可以
    發表于 07-29 11:18 ?3136次閱讀

    種改進的殘差網絡結構以減少卷積參數

    網絡結構,以降低殘差塊數量與卷積核數量減少卷積參數。同時,在原始損失函數中加入類間相似懲罰項
    發表于 03-23 14:48 ?8次下載
    <b class='flag-5'>一</b>種改進的殘差網絡結構以減少<b class='flag-5'>卷積</b><b class='flag-5'>層</b>參數

    如何去理解CNN卷積與池化計算?

    概述 深度學習中CNN網絡是核心,對CNN網絡來說卷積與池化的計算至關重要,不同的步長、填充方式、卷積核大小、
    的頭像 發表于 04-06 15:13 ?2761次閱讀
    如何去理解CNN<b class='flag-5'>卷積</b><b class='flag-5'>層</b>與池化<b class='flag-5'>層</b>計算?

    卷積神經網絡層級結構 卷積神經網絡的卷積講解

    像分類、目標檢測、人臉識別等。卷積神經網絡的核心是卷積和池化,它們構成了網絡的主干,實現了對圖像特征的提取和抽象。
    的頭像 發表于 08-21 16:49 ?8929次閱讀

    卷積神經網絡共有幾層 卷積神經網絡模型三

    卷積神經網絡共有幾層 卷積神經網絡模型三? 卷積神經網絡 (Convolutional Neural Networks,CNNs) 是
    的頭像 發表于 08-21 17:11 ?7045次閱讀

    卷積神經網絡每一層的作用

    (Input Layer) 輸入卷積神經網絡的第一層,負責接收輸入數據。在圖像識別任務中,輸入通常接收
    的頭像 發表于 07-02 15:28 ?1610次閱讀

    卷積神經網絡激活函數的作用

    卷積神經網絡(Convolutional Neural Networks, CNNs)是深度學習中種重要的神經網絡結構,廣泛應用于圖像識別、語音識別、自然語言處理等領域。在卷積神經網絡中,激活
    的頭像 發表于 07-03 09:18 ?1117次閱讀
    主站蜘蛛池模板: 午夜小视频免费观看| sihu在线| 老师办公室高h文小说| 国产三片高清在线观看| 午夜影院18| 天天网综合| 成人三级电影在线观看| 噜噜噜久久| 日韩一级在线视频| 永久免费的拍拍拍网站| 天天夜天天干| 新版天堂中文资源8在线| 国产va免费精品| 韩国三级中文| 女人张开腿男人猛桶视频| 日韩系列| 免费看黄色毛片| 女人张腿让男桶免费视频观看| 你懂的在线观看网址| 国产色婷婷亚洲| 很狠操| 久青草国产高清在线视频| 人人插人人射| 日韩一级高清| 精品久久中文网址| 久久精品国产清自在天天线| 欧美一级艳片视频免费观看| 四虎在线永久视频观看| 亚洲黄色高清视频| 亚洲性人人天天夜夜摸| 在线观看精品国产福利片100| 黄免费网站| 国产成人精品高清免费| re99热| 在线高清国产| 色老头·com| 欧美性f| 久久久一本| 国产图片综合| 天天干天天做天天射| 欧美黄色片免费|