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

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

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

3天內不再提示

用C語言實現一個全連接層和激活函數ReLU

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

在上一篇文章中,我們用C語言實現了一個卷積層,并查看了結果。在本文中,我們將實現其余未實現的層:全連接層、池化層和激活函數 ReLU。

每一層的實現

全連接層

全連接層是將輸入向量X乘以權重矩陣W,然后加上偏置B的過程。下面轉載第二篇的圖,能按照這個圖計算就可以了。

d1d45f6a-b8ec-11ed-bfe3-dac502259ad0.png

全連接層的實現如下。

voidlinear(constfloat*x,constfloat*weight,constfloat*bias,
int64_tin_features,int64_tout_features,float*y){
for(int64_ti=0;i

該函數的接口和各個數據的內存布局如下。

考慮稍后設置 PyTorch 參數,內存布局與 PyTorch 對齊。

輸入

x: 輸入圖像。shape=(in_features)

weight: 權重因子。shape=(out_features, in_features)

bias: 偏置值。shape=(out_features)

輸出

y: 輸出圖像。shape=(out_features)

參數

in_features: 輸入順序

out_features: 輸出順序

在全連接層中,內部操作數最多為out_channels * in_channels一個,對于典型參數,操作數遠低于卷積層。

另一方面,關注權重因子,卷積層為shape=(out_channels, in_channels, ksize, ksize),而全連接層為shape=(out_features, in_features)。

例如,如果層從卷積層變為全連接層,in_features = channels * width * height則以下關系成立。width, height >> ksize考慮到這一點,在很多情況下,全連接層參數的內存需求大大超過了卷積層。

由于FPGA內部有豐富的SRAM緩沖區,因此擅長處理內存訪問量大和內存數據相對于計算總量的大量復用。

單個全連接層不會復用權重數據,但是在視頻處理等連續處理中,這是一個優勢,因為要進行多次全連接。

另一方面,本文標題中也提到的邊緣環境使用小型FPGA,因此可能會出現SRAM容量不足而需要訪問外部DRAM的情況。

如果你有足夠的內存帶寬,你可以按原樣訪問它,但如果你沒有足夠的內存帶寬,你可以在參數調整和訓練后對模型應用稱為剪枝和量化的操作。

池化層

池化層是對輸入圖像進行縮小的過程,這次使用的方法叫做2×2 MaxPooling。在這個過程中,取輸入圖像2x2區域的最大值作為輸出圖像一個像素的值。這個看第二張圖也很容易理解,所以我再貼一遍。

d1e5c2dc-b8ec-11ed-bfe3-dac502259ad0.png

即使在池化層,輸入圖像有多個通道,但池化過程本身是針對每個通道獨立執行的。因此,輸入圖像中的通道數和輸出圖像中的通道數在池化層中始終相等。

池化層的實現如下所示:

voidmaxpool2d(constfloat*x,int32_twidth,int32_theight,int32_tchannels,int32_tstride,float*y){
for(intch=0;ch

這個函數的接口是:

此實現省略了邊緣處理,因此圖像的寬度和高度都必須能被stride整除。

輸入

x: 輸入圖像。shape=(channels, height, width)

輸出

y: 輸出圖像。shape=(channels, height/stride, width/stride)

參數

width: 圖像寬度

height: 圖像高度

stride:減速比

ReLU

ReLU 非常簡單,因為它只是將負值設置為 0。

voidrelu(constfloat*x,int64_tsize,float*y){
for(int64_ti=0;i

由于每個元素的處理是完全獨立的,x, y因此未指定內存布局。

硬件生成

到這里為止的內容,各層的功能都已經完成了。按照上一篇文章中的步驟,可以確認這次創建的函數也產生了與 libtorch 相同的輸出。

此外,Vivado HLS 生成了一個通過 RTL 仿真的電路。從這里開始,我將簡要說明實際生成了什么樣的電路。

如果將上述linear函數原樣輸入到 Vivado HLS,則會發生錯誤。這里,將輸入輸出設為指針->數組是為了決定在電路制作時用于訪問數組的地址的位寬。

另外,in_features的值為778=392,out_將features的值固定為32。這是為了避免Vivado HLS 在循環次數可變時輸出性能不佳。

staticconststd::size_tkMaxSize=65536;

voidlinear_hls(constfloatx[kMaxSize],constfloatweight[kMaxSize],
constfloatbias[kMaxSize],floaty[kMaxSize]){
dnnk::linear(x,weight,bias,7*7*8,32,y);
}

linear_hls函數的綜合報告中的“性能估計”如下所示:

d1fd7c74-b8ec-11ed-bfe3-dac502259ad0.png

在Timing -> Summary中寫入了綜合時指定的工作頻率,此時的工作頻率為5.00 ns = 200MHz。

重要的是 Latency -> Summary 部分,它描述了執行此函數時的周期延遲(Latency(cycles))和實時延遲(Latency(absolute))。看看這個,我們可以看到這個全連接層在 0.566 ms內完成。

在 Latency -> Detail -> Loop 列中,描述了每個循環的一次迭代所需的循環次數(Iteration Latency)和該循環的迭代次數(Trip Count)。

延遲(周期)包含Iteration Latency * Trip Count +循環初始化成本的值。Loop 1 是out_features循環到loop 1.1 in_features。

在Loop1.1中進行sum += x[j] * weight[i * in_features + j]; 簡單計算會發現需要 9 個周期才能完成 Loop 1.1 所做的工作。

使用HLS中的“Schedule Viewer”功能,可以更詳細地了解哪些操作需要花費更多長時間。

下圖橫軸的2~10表示Loop1.1的處理內容,大致分為x,weights等的加載2個循環,乘法(fmul)3個循環,加法(fadd)4個循環共計9個循環。

d21899a0-b8ec-11ed-bfe3-dac502259ad0.png

在使用 HLS 進行開發期間通過添加#pragma HLS pipeline指令,向此代碼添加優化指令以指示它創建高效的硬件。

與普通的 FPGA 開發類似,運算單元的流水線化和并行化經常用于優化。通過這些優化,HLS 報告證實了加速:

流水線:減少迭代延遲(min=1)

并行化:減少行程次數,刪除循環

正如之前也說過幾次的那樣,這次的課程首先是以FPGA推理為目的,所以不會進行上述的優化。

最后,該函數的接口如下所示。

d245d35c-b8ec-11ed-bfe3-dac502259ad0.png

由于本次沒有指定接口,所以數組接口如x_ 等ap_memory對應FPGA上可以1個周期讀寫的存儲器(BRAM/Distributed RAM)。

在下一篇文章中,我們將連接每一層的輸入和輸出,但在這種情況下,我們計劃連接 FPGA 內部的存儲器作為每一層之間的接口,如本例所示。

總結

在本文中,我們實現了全連接層、池化層和 ReLU。現在我們已經實現了所有層,我們將在下一篇文章中組合它們。之后我們會實際給MNIST數據,確認我們可以做出正確的推論。






審核編輯:劉清

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

    關注

    1630

    文章

    21776

    瀏覽量

    604679
  • DRAM
    +關注

    關注

    40

    文章

    2320

    瀏覽量

    183692
  • sram
    +關注

    關注

    6

    文章

    768

    瀏覽量

    114759
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137250
收藏 人收藏

    評論

    相關推薦

    C語言實現:見縫插針游戲!代碼思路+源碼分享

    見縫插圓我們昨天已經C語言實現了,今天將實現見縫插針的游戲。
    發表于 12-05 11:02 ?760次閱讀

    介紹C語言實現的http下載器

    做OTA升級功能時,能直接拿到的往往只是升級包的鏈接,需要我們自己去下載,這時候就需要用到http下載器,下文介紹C語言實現的http下載器。
    發表于 02-22 10:25 ?409次閱讀

    如何用C語言實現面向對象編程

    1 C語言實現面向對象編程GOF的《設計模式》書的副標題叫做“可復用面向對象軟件的基礎”,從標題就能看出面向對象是設計模式基本思想。由于C
    發表于 07-12 07:24

    C語言實現的泛型函數swap()

    C語言實現的泛型函數swap():交換兩變量中的數據.
    發表于 01-20 07:10

    正余弦函數曲線的C語言繪制方法

    今天來學習小小的實例,使用C語言實現在屏幕上“*”顯示0-360度的余弦函數cos(x)曲
    發表于 11-15 18:25 ?36次下載

    正余弦函數曲線的C語言繪制方法

    今天來學習小小的實例,使用C語言實現在屏幕上“*”顯示0-360度的余弦函數cos(x)曲
    發表于 11-15 18:25 ?16次下載

    C語言實現DES算法

    C語言實現DES算法 本DES算法,使用了效率很高的C完成。目前,國內知名企業的POS終端中,單DES算法,均是采用這個函數完成。
    發表于 01-16 10:09 ?3274次閱讀

    C語言實現FFT算法

    C語言實現FFT算法 /*****************fft programe*********************/#include "typedef.h" #include "math.h" struct
    發表于 10-30 13:39 ?6349次閱讀

    C語言實現數字濾波

    C語言實現數字濾波 。對數值進行精度調整,下面給出幾種常用的數字濾波方法的C語言函數,這些
    發表于 07-26 15:44 ?10次下載

    4重要算法C語言實現源代碼

    4重要算法C語言實現源代碼
    發表于 06-10 08:00 ?12次下載

    激活函數中sigmoid、ReLU函數些性質

    非線性:當激活函數是線性的時候,的神經網絡就可以基本逼近所有的函數,但是,如果
    的頭像 發表于 08-02 14:52 ?1.1w次閱讀
    <b class='flag-5'>激活</b><b class='flag-5'>函數</b>中sigmoid、<b class='flag-5'>ReLU</b>等<b class='flag-5'>函數</b>的<b class='flag-5'>一</b>些性質

    使用C語言實現圖書館管理系統的源代碼和函數及軟件等資料合集

    本文檔的主要內容詳細介紹的是使用C語言實現圖書館管理系統的源代碼和函數及軟件等資料合集
    發表于 03-03 08:00 ?9次下載
    使用<b class='flag-5'>C</b><b class='flag-5'>語言實現</b>圖書館管理系統的源代碼和<b class='flag-5'>函數</b>及軟件等資料合集

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

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

    怎么C語言實現多態

    這里我想主要介紹下在C語言中是如何實現的面向對象。知道了C語言實現面向對象的方式,我們再聯想下,C
    的頭像 發表于 10-12 09:12 ?2076次閱讀

    使用C語言實現函數模板

      C語言能不能實現通用的函數,既能完成整數的
    的頭像 發表于 11-09 11:38 ?429次閱讀
    主站蜘蛛池模板: 人人精品久久| 人人干人人爱| 高h肉宠文1v1男男| 在线观看视频色| 在线色播| 四虎影视网站| 日韩免费视频一区| 欧美综合影院| 韩国a级床戏大尺度在线观看| 国产裸露片段精华合集链接| freesexvideo性残疾| 97爱爱| 日韩亚洲欧美日本精品va| 国产乱子伦一区二区三区| 国产h在线| 最近2018中文字幕免费视频| 婷婷色亚洲| 欧美sese| 91成人在线播放| 免费一级特黄特色大片在线观看看| 成人免费久久精品国产片久久影院 | 免费被视频网站在线观看| 女人的逼毛片| 天堂资源bt种子在线| 农村的毛片丨级| 97人人在线| 欧美成人免费观看bbb| 欧美色网在线| 在线亚洲日产一区二区| 色免费在线| 国产成人精品日本| 日本在线视| 1024人成软件色www| 伊人狠狠丁香婷婷综合色| 日韩一区二区视频在线观看| 国产三级视频| 欧美精品aaa久久久影院| 717影院理伦午夜论八戒| 五月婷婷之婷婷| 国产一区二区三区 韩国女主播| 午夜 福利 视频|