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

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

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

3天內不再提示

基于FPGA搭建神經(jīng)網(wǎng)絡的步驟解析

FPGA設計論壇 ? 來源:CSDN技術社區(qū) ? 2025-06-03 15:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文的目的是在一個神經(jīng)網(wǎng)絡已經(jīng)通過python或者MATLAB訓練好的神經(jīng)網(wǎng)絡模型,將訓練好的模型的權重和偏置文件以TXT文件格式導出,然后通過python程序將txt文件轉化為coe文件,(coe文件是為了將其寫入rom,網(wǎng)絡中的權重和偏置通過讀取ROM即可,后續(xù)需要修改輸入其他特征值,只需要修改input的rom里面的coe文件即可)。

設計思想

其中sigmoid函數(shù)是本次實驗最大的難點,因為sigmoid函數(shù)的值是在0-1之間的小數(shù),其值越大,說明該模型的輸出是該結果的幾率越大。但是verilog硬件描述語言,其計算結果只有0或1兩種情況,所以要想直接通過verilog語言計算出sigmoid函數(shù)的值是比較復雜的,本次使用的方法為查找表法,通過外部其他語言計算出sigmoid函數(shù)的值,然后將其放入查找表,后續(xù)當需要使用sigmoid函數(shù)時,直接輸出結果。但是這個需要不斷地往里面加值,每更新一次輸入,那么就往sigmoid模塊里面的查找表添加上該輸入的sigmoid值。

由于FPGA的計算是基于數(shù)字邏輯和二進制運算,小數(shù)計算只能通過 固定點數(shù)(即帶有定點小數(shù)位的整數(shù)表示)來模擬某些浮點數(shù)計算。這需要使用額外的邏輯來實現(xiàn)浮點數(shù)的運算、舍入和特殊值處理。

但是本文選擇一個簡便的方法,選擇將輸入,權重 分別保留兩位小數(shù)(可自己選擇位數(shù),保留越多精度越高,反之精度越低),然后分別將其乘以100,將數(shù)據(jù)全都變成帶符號整數(shù),然后將其進行乘加運算。將偏置保留4位小數(shù)并乘以10000,得到的結果除以10000然后進行sigmoid計算,后續(xù)無論添加多少層,都可以以此方法來進行計算。以下為搭建神經(jīng)網(wǎng)絡的步驟:

step1: 處理數(shù)據(jù),將保存好的權重文件轉化為coe文件,然后添加一個ROM,并將coe文件加載進ROM里面;

module input_rom_ctr(

input sys_clk,//50MHz時鐘

input rst_n,//復位,低電平有效

input [5:0] data_deep,

output reg [31:0] rom_data_r, //ROM讀出數(shù)據(jù)

output reg viald,

output reg [6:0] rom_addr_rr //ROM輸入地址

);

reg [6:0] rom_addr;

//產(chǎn)生ROM地址讀取數(shù)據(jù)

always @ (posedge sys_clk or negedge rst_n)

begin

if(!rst_n)begin

rom_addr <= 7'd0;

viald <= 1'b1;

end

else if(rom_addr_rr >= (data_deep -1'd1))begin

viald <= 1'b0;

end

else if(rom_addr >= (data_deep - 1'd1))begin

rom_addr <= 7'd0;

end

else begin

rom_addr <= rom_addr+1'b1;

viald <= viald;

end

end

reg [6:0]rom_addr_r;

always @(posedge sys_clk or negedge rst_n) begin

if(!rst_n)begin

rom_addr_r <= 7'd0;

rom_addr_rr <= 7'd0;

end

else begin

rom_addr_r <= rom_addr;

rom_addr_rr <= rom_addr_r;

end

end

wire [31:0] rom_data;

always @(posedge sys_clk or negedge rst_n)begin

if(!rst_n)begin

rom_data_r <= 32'd0;

end

else begin

rom_data_r <= #2 rom_data;

end

end

//實例化ROM

input_rom rom_ip_inst

(

.clka (sys_clk ), //inoput clka

.addra (rom_addr), //input [4:0] addra

.douta (rom_data) //output [7:0] douta

);

endmodule

step2:將ROM里的數(shù)據(jù)讀取出來,如果數(shù)據(jù)較少就直接使用二維數(shù)組保存數(shù)據(jù),較多的話可以添加一個RAM,然后通過調用RAM里面的變量搭建第一層神經(jīng)網(wǎng)絡(暫不添加sigmoid)。

input_rom_ctr input_rom( //取輸入層的數(shù)據(jù)存入ram

.sys_clk (clk),//50MHz時鐘

.rst_n (rst_n),//復位,低電平有效

.data_deep(5),

.rom_data_r (rom_data1), //ROM讀出數(shù)據(jù)

.viald (en_wr1),

.rom_addr_rr (input_index)

);

always @(posedge clk)begin

if(en_wr1) begin

input_layer[input_index] <= rom_data1; ? //從rom里面讀出數(shù)據(jù),并將其寫入ram/寄存器里面,后面的神經(jīng)網(wǎng)絡直接調用寄存器操作

end

else begin

input_data <= input_layer[input_index];//從ram里面讀出來的數(shù)據(jù),加載地址就得到相應的數(shù)據(jù)。

end

end

Step3:通過仿真得到第一層神經(jīng)網(wǎng)絡每個神經(jīng)元的乘加結果,并加上偏置后,通過外部計算得到sigmoid值后將其添加到sigmoid模塊的lut查找模塊中,如此反復,最后就可以得到一個神經(jīng)網(wǎng)絡框架。(sigmoid函數(shù)的結果也要乘以100,作為下一層的輸入),最后得到的輸入層的每個神經(jīng)元的結果就代表其識別結果的概率。

module sigmoid (

input wire signed [31:0] input_value, // 輸入32位有符號整數(shù)

output reg signed [31:0] sigmoid_output // 輸出32位有符號整數(shù)

);

always @(*) begin //可以看做是一個查找表,將上一層的輸入進入sigmoid函數(shù)來進行查找值,然后將得到的值乘以100用于保留兩位小數(shù),精度要求高的就多乘一點

case (input_value)

-2673 : sigmoid_output = 43; //上一層輸入3490,是原本輸入乘以100,保留兩位小數(shù)乘以權重乘以100,即改結果是原本結果的10000倍,所以進sigmoid函數(shù)的應該是0.349

17232 : sigmoid_output = 85; //建議以后有更多值后繼續(xù)添加,查找表越豐滿,后續(xù)能使用的輸入就越多。

36380 : sigmoid_output = 97;

124358 : sigmoid_output = 100;

-47650 : sigmoid_output = 1;

-5781 : sigmoid_output = 36;

3657 : sigmoid_output = 59;

-23082 : sigmoid_output = 9;

///上面是第一層隱層的結果,下面是輸出層的結果。

4816 : sigmoid_output = 62;

-3390 : sigmoid_output = 42;

20652 : sigmoid_output = 89;

-4386 : sigmoid_output = 39;

-2004 : sigmoid_output = 45;

-623 : sigmoid_output = 48;

default: sigmoid_output = 0;

endcase

end

endmodule

仿真結果

3b3124c8-3b88-11f0-b715-92fbcf53809c.png

最后的output_layer就是輸出的最后結果。

來源:https://blog.csdn.net/qq_48434158/article/details/132426289

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

    關注

    1650

    文章

    22207

    瀏覽量

    626948
  • matlab
    +關注

    關注

    189

    文章

    3009

    瀏覽量

    236719
  • 神經(jīng)網(wǎng)絡

    關注

    42

    文章

    4819

    瀏覽量

    106077
  • 函數(shù)
    +關注

    關注

    3

    文章

    4400

    瀏覽量

    66381
  • python
    +關注

    關注

    56

    文章

    4848

    瀏覽量

    88974

原文標題:基于FPGA的神經(jīng)網(wǎng)絡的預測過程的實現(xiàn)

文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    遺傳算法 神經(jīng)網(wǎng)絡 解析

    關于遺傳算法和神經(jīng)網(wǎng)絡
    發(fā)表于 05-19 10:22

    脈沖耦合神經(jīng)網(wǎng)絡FPGA上的實現(xiàn)誰會?

    脈沖耦合神經(jīng)網(wǎng)絡(PCNN)在FPGA上的實現(xiàn),實現(xiàn)數(shù)據(jù)分類功能,有報酬。QQ470345140.
    發(fā)表于 08-25 09:57

    【PYNQ-Z2試用體驗】基于PYNQ的神經(jīng)網(wǎng)絡自動駕駛小車 - 項目規(guī)劃

    神經(jīng)網(wǎng)絡技術的第三次發(fā)展浪潮仍在繼續(xù),在其背后,高性能CPU、GPU和FPGA、ASIC以強大的算力為技術的應用落地提供了有力的支持。然而目前基于FPGA平臺搭建
    發(fā)表于 03-02 23:10

    卷積神經(jīng)網(wǎng)絡如何使用

    卷積神經(jīng)網(wǎng)絡(CNN)究竟是什么,鑒于神經(jīng)網(wǎng)絡在工程上經(jīng)歷了曲折的歷史,您為什么還會在意它呢? 對于這些非常中肯的問題,我們似乎可以給出相對簡明的答案。
    發(fā)表于 07-17 07:21

    【案例分享】ART神經(jīng)網(wǎng)絡與SOM神經(jīng)網(wǎng)絡

    今天學習了兩個神經(jīng)網(wǎng)絡,分別是自適應諧振(ART)神經(jīng)網(wǎng)絡與自組織映射(SOM)神經(jīng)網(wǎng)絡。整體感覺不是很難,只不過一些最基礎的概念容易理解不清。首先ART神經(jīng)網(wǎng)絡是競爭學習的一個代表,
    發(fā)表于 07-21 04:30

    如何設計BP神經(jīng)網(wǎng)絡圖像壓縮算法?

    (Digital Signal Processor)相比,現(xiàn)場可編程門陣列(Field Programma-ble Gate Array,FPGA)在神經(jīng)網(wǎng)絡的實現(xiàn)上更具優(yōu)勢。DSP處理器在處理時采用指令順序執(zhí)行
    發(fā)表于 08-08 06:11

    解析深度學習:卷積神經(jīng)網(wǎng)絡原理與視覺實踐

    解析深度學習:卷積神經(jīng)網(wǎng)絡原理與視覺實踐
    發(fā)表于 06-14 22:21

    如何移植一個CNN神經(jīng)網(wǎng)絡FPGA中?

    訓練一個神經(jīng)網(wǎng)絡并移植到Lattice FPGA上,通常需要開發(fā)人員既要懂軟件又要懂數(shù)字電路設計,是個不容易的事。好在FPGA廠商為我們提供了許多工具和IP,我們可以在這些工具和IP的基礎上做
    發(fā)表于 11-26 07:46

    基于FPGA神經(jīng)網(wǎng)絡的性能評估及局限性

    FPGA實現(xiàn)神經(jīng)網(wǎng)絡關鍵問題分析基于FPGA的ANN實現(xiàn)方法基于FPGA神經(jīng)網(wǎng)絡的性能評估及局限性
    發(fā)表于 04-30 06:58

    如何用ARM和FPGA搭建神經(jīng)網(wǎng)絡處理器通信方案?

    某人工神經(jīng)網(wǎng)絡FPGA處理器能夠對數(shù)據(jù)進行運算處理,為了實現(xiàn)集數(shù)據(jù)通信、操作控制和數(shù)據(jù)處理于一體的便攜式神經(jīng)網(wǎng)絡處理器,需要設計一種基于嵌入式ARM內核及現(xiàn)場可編程門陣列FPGA的主
    發(fā)表于 05-21 06:35

    基于光學芯片的神經(jīng)網(wǎng)絡訓練解析,不看肯定后悔

    基于光學芯片的神經(jīng)網(wǎng)絡訓練解析,不看肯定后悔
    發(fā)表于 06-21 06:33

    如何構建神經(jīng)網(wǎng)絡?

    原文鏈接:http://tecdat.cn/?p=5725 神經(jīng)網(wǎng)絡是一種基于現(xiàn)有數(shù)據(jù)創(chuàng)建預測的計算系統(tǒng)。如何構建神經(jīng)網(wǎng)絡神經(jīng)網(wǎng)絡包括:輸入層:根據(jù)現(xiàn)有數(shù)據(jù)獲取輸入的層隱藏層:使用反向傳播優(yōu)化輸入變量權重的層,以提高模型的預測
    發(fā)表于 07-12 08:02

    基于FPGA的RBF神經(jīng)網(wǎng)絡硬件實現(xiàn)

    基于FPGA的RBF神經(jīng)網(wǎng)絡硬件實現(xiàn)說明。
    發(fā)表于 04-28 11:24 ?27次下載

    基于FPGA神經(jīng)網(wǎng)絡硬件實現(xiàn)方法

    基于FPGA神經(jīng)網(wǎng)絡硬件實現(xiàn)方法說明。
    發(fā)表于 06-01 09:35 ?51次下載
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>神經(jīng)網(wǎng)絡</b>硬件實現(xiàn)方法

    卷積神經(jīng)網(wǎng)絡模型搭建

    卷積神經(jīng)網(wǎng)絡模型搭建 卷積神經(jīng)網(wǎng)絡模型是一種深度學習算法。它已經(jīng)成為了計算機視覺和自然語言處理等各種領域的主流算法,具有很大的應用前景。本篇文章將詳細介紹卷積神經(jīng)網(wǎng)絡模型的
    的頭像 發(fā)表于 08-21 17:11 ?1437次閱讀