介紹
在深度學(xué)習(xí)中,卷積神經(jīng)網(wǎng)絡(luò)(CNN或ConvNet)是一類人工神經(jīng)網(wǎng)絡(luò)(ANN),最常用于分析視覺(jué)圖像。
CNN 也稱為移位不變或空間不變?nèi)斯ど窠?jīng)網(wǎng)絡(luò)(Shift Invariant or Space Invariant Artificial Neural Networks ,SIANN ),它基于卷積核或濾波器的共享權(quán)重架構(gòu),沿輸入特征滑動(dòng)并提供稱為特征映射的平移等變響應(yīng)。它們?cè)趫D像和視頻識(shí)別、推薦系統(tǒng)、圖像分類、圖像分割、醫(yī)學(xué)圖像分析、自然語(yǔ)言處理、腦機(jī)接口和金融時(shí)間序列中都有應(yīng)用。
CNN 是多層感知器的正則化版本。多層感知器通常表示全連接網(wǎng)絡(luò),即一層中的每個(gè)神經(jīng)元都連接到下一層中的所有神經(jīng)元。這些網(wǎng)絡(luò)的“完全連通性”使它們?nèi)菀走^(guò)度擬合數(shù)據(jù)。正則化或防止過(guò)擬合的典型方法包括:在訓(xùn)練期間懲罰參數(shù)(例如權(quán)重衰減)或修剪連接性(跳過(guò)連接、丟失等) CNN 采用不同的正則化方法:它們利用數(shù)據(jù)中的分層模式并使用在過(guò)濾器中壓印的更小更簡(jiǎn)單的圖案來(lái)組裝復(fù)雜度越來(lái)越高的圖案。因此,在連接性和復(fù)雜性的規(guī)模上,CNN 處于較低的極端。
與其他圖像分類算法相比,CNN 使用的預(yù)處理相對(duì)較少。這意味著網(wǎng)絡(luò)通過(guò)自動(dòng)學(xué)習(xí)來(lái)學(xué)習(xí)優(yōu)化過(guò)濾器(或內(nèi)核),而在傳統(tǒng)算法中,這些過(guò)濾器是手工設(shè)計(jì)的。這種獨(dú)立于先驗(yàn)知識(shí)和特征提取的人為干預(yù)是一個(gè)主要優(yōu)勢(shì)。
cnn_hardware_acclerator_for_fpga
https://github.com/sumanth-kalluri/cnn_hardware_acclerator_for_fpga
https://thedatabus.io/introduction
這是完全參數(shù)化的 Verilog 實(shí)現(xiàn)CNN,用于加速 FPGA 上的卷積神經(jīng)網(wǎng)絡(luò)推理
軟件工具:
設(shè)計(jì) - Xilinx Vivado 2017
驗(yàn)證 - Python 3.6 和 Xilinx ISE 14.7 命令行工具
convolution_network_on_FPGA
https://github.com/hunterlew/convolution_network_on_FPGA
描述
該項(xiàng)目使用 ISE 14.7 和 vertix-7 FPGA 構(gòu)建。它使用某些加速策略執(zhí)行 7 層網(wǎng)絡(luò)前向計(jì)算。首先,使用MatConvNet在 MSTAR 數(shù)據(jù)集上訓(xùn)練一個(gè) SAR 目標(biāo)分類網(wǎng)絡(luò),并使用 early-stop。然后,使用 Matlab 將權(quán)重和輸入轉(zhuǎn)換為 FPGA 可以加載的 COE 文件。接下來(lái),設(shè)計(jì)原生 verilog 編寫(xiě)的模型來(lái)完成前向計(jì)算。系統(tǒng)使用 16 位定點(diǎn)數(shù)據(jù)來(lái)保持精度。結(jié)果證明,它每張圖像的花費(fèi)不到 1ms,優(yōu)于其他計(jì)算平臺(tái)。
加速
第一個(gè)轉(zhuǎn)換需要對(duì) FPGA 的資源和速度之間權(quán)衡,考慮到第一個(gè)轉(zhuǎn)換中輸入和權(quán)重的大小,如果層較大,那么該層就應(yīng)該使用移位寄存器結(jié)構(gòu)進(jìn)行加速。另一個(gè)轉(zhuǎn)化,層僅需要使用管道結(jié)構(gòu)。請(qǐng)注意,有 18 個(gè)文件以 m_conv_1 命名,表示第一個(gè) conv 中有 18 個(gè)移位寄存器。
對(duì)于帶寬的限制,第二個(gè)轉(zhuǎn)換層,使用通道分組并行化方案。使用 v7-415t 和 v7-485t FPGA 進(jìn)行比較,它們根據(jù)不同的資源量使用不同的組號(hào)(4 vs 1)。可能會(huì)注意到文件 CNN_top.v 中的方案,其中包含控制通道分組和合并的信號(hào)“ram_ready”。
CNN-FPGA
https://github.com/QShen3/CNN-FPGA
有以下幾個(gè)模塊:
Conv2d
說(shuō)明:
卷積模塊,可以進(jìn)行二維卷積。支持多個(gè)卷積核,不同步長(zhǎng),是否啟用邊緣0填充等
可配置參數(shù):
PADDINGENABLE邊緣是否使用0填充,1代表是,0代表否0
輸入輸出:
Max_pool
說(shuō)明:
最大池化模塊,可以對(duì)輸入進(jìn)行最大池化運(yùn)算。
可配置參數(shù):
輸入輸出:
FPGA-CNN
https://github.com/dem123456789/FPGA-CNN
FPGA 實(shí)現(xiàn)的CNN:
CNN.v是頂層設(shè)計(jì),初始化A,B,I。模板為16x16層模塊sixteenbysixteen.v
SixteenbySixteen.java生成Verilog代碼
clacc
https://github.com/taoyilee/clacc
原為清華大學(xué)深度學(xué)習(xí)硬件加速器課程項(xiàng)目,由林允龍教授主講。該課程相當(dāng)于斯坦福大學(xué)的CS231n(http://cs231n.stanford.edu/)。
深度學(xué)習(xí)加速器(卷積神經(jīng)網(wǎng)絡(luò))
這是在 Verilog 中實(shí)現(xiàn)類似 MIT Eyeriss 的深度學(xué)習(xí)加速器
注:clacc代表卷積層加速器
RTL-Implementation-of-Two-Layer-CNN
https://github.com/Haleski47/RTL-Implementation-of-Two-Layer-CNN
https://github.com/Di5h3z/ECE-564-Convolutional-Neural-Network-Accelerator
具有詳細(xì)設(shè)計(jì)的兩層 CNN
詳細(xì)的設(shè)計(jì)文檔:
https://github.com/Haleski47/RTL-Implementation-of-Two-Layer-CNN/blob/master/report/Apar%20Bansal%20ECE564%20Project.pdf
NTHU-ICLAB
https://github.com/LeoTheBestCoder/NTHU-ICLAB
這是清華大學(xué)IC LAB提供的一個(gè)非常詳細(xì)的設(shè)計(jì)項(xiàng)目,逐步實(shí)現(xiàn)一個(gè)CNN,并附帶測(cè)試項(xiàng)目。
下面是每一步的功能,并且每一步都有詳細(xì)的設(shè)計(jì)文檔。
最終實(shí)現(xiàn):使用 CNN 進(jìn)行數(shù)字分類
ES203-COA-CNN
https://github.com/akcgjc007/ES203-COA-CNN
具體的實(shí)現(xiàn)過(guò)程:
代碼介紹:
https://www.youtube.com/watch?v=3J2X-j0z2M8
結(jié)果:
MNIST_CNN_HDL
https://github.com/makifozkanoglu/MNIST_CNN_HDL
https://github.com/flystandard1/CNN_hardware_ECE1718_UofT
通過(guò)硬件加速提升 CNN-mnist 的性能
文件夾“design_files”包括硬件中的所有設(shè)計(jì)文件
文件夾“verification_files”是設(shè)計(jì)文件的驗(yàn)證環(huán)境
文件夾“weights”包括 mnist 和輸入圖像的權(quán)重
CNN-Implementation-in-Verilog
https://github.com/boaaaang/CNN-Implementation-in-Verilog
使用 Python & Verilog 實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)
實(shí)現(xiàn)框圖:
仿真波形
CNN_Core
https://github.com/0x5b25/CNN_Core
使用 Altera Avalon-MM 總線
使用 quartus prime ide 在 Stratix IV 上編譯和測(cè)試。
更多介紹請(qǐng)參考instructions.txt
CNN-Accelerator-VLSI
https://github.com/lirui-shanghaitech/CNN-Accelerator-VLSI
詳細(xì)要求在./resource/Project_2.0.pdf中有詳細(xì)介紹。
下面列出一些主要要求:
所有輸入特征圖和權(quán)重的位長(zhǎng)為 8 位,輸出為 25 位數(shù)據(jù)。
輸入特征圖帶寬為8x8位,權(quán)重帶寬也是8x8位(最大同時(shí)讀取8個(gè)輸入特征圖和8個(gè)權(quán)重)
輸出帶寬為 2x25 位(最多同時(shí)將 2 個(gè)輸出寫(xiě)入主存)
結(jié)果如下:
注意:這個(gè)項(xiàng)目有一部分所需的文件沒(méi)有公開(kāi),但是,可以將此設(shè)計(jì)合成到 FPGA。
CNN-FPGA
https://github.com/omarelhedaby/CNN-FPGA
在ZYNQ FPGA上實(shí)現(xiàn)CNN,使用MNIST數(shù)據(jù)庫(kù)對(duì)手寫(xiě)數(shù)字進(jìn)行分類
網(wǎng)絡(luò) Conv2D->Tanh Activation->AvgPool->Conv2D->Tanh Activation->AvgPool->Conv2D->Tanh Activation->全連接層->Relu->全連接層->Softmax
該項(xiàng)目很完整,雖然Readme寫(xiě)的不是很完整,但是有個(gè)詳細(xì)的設(shè)計(jì)、仿真及驗(yàn)證完檔。
https://github.com/omarelhedaby/CNN-FPGA/blob/master/Hardware%20Documentation.pdf
Image-Classification-using-CNN-on-FPGA
https://github.com/padhi499/Image-Classification-using-CNN-on-FPGA
簡(jiǎn)介
在 FPGA 上使用 CNN 進(jìn)行圖像分類
項(xiàng)目是關(guān)于在 FPGA 上設(shè)計(jì)一個(gè)經(jīng)過(guò)訓(xùn)練的神經(jīng) n/w(CIFAR-10 數(shù)據(jù)集),以使用深度學(xué)習(xí)概念(CNN-卷積神經(jīng)網(wǎng)絡(luò))對(duì)圖像 I/P 進(jìn)行分類。
有 6 層(滑動(dòng)窗口卷積、ReLU 激活、最大池化、扁平化、完全連接和 Softmax 激活)決定了我們的 I/P 圖像的類別。內(nèi)核/過(guò)濾器用于從圖像 I/P 進(jìn)行特征檢測(cè)。圖像 I/P 可以是灰度/彩色的。
使用的工具
Vivado v17.4
Matlab vR2018.a
DigitalRecognition
https://github.com/suisuisi/FPGAandCNN
《基于FPGA的數(shù)字識(shí)別-實(shí)時(shí)視頻處理的定點(diǎn)卷積神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)》
posture_recognition_CNN
https://github.com/cxdzyq1110/posture_recognition_CNN
簡(jiǎn)介
基于CNN的姿態(tài)識(shí)別
幫助機(jī)器通過(guò)攝像頭了解我們?nèi)祟愒谧鍪裁词呛苤匾?。一旦?shí)現(xiàn),機(jī)器就可以對(duì)人類的各種姿勢(shì)做出不同的反應(yīng)。但是這個(gè)過(guò)程也非常困難,因?yàn)橥ǔ_@個(gè)過(guò)程實(shí)現(xiàn)不僅速度跟不上并且耗電,同時(shí)也需要非常大的內(nèi)存空間。
這里我們專注于實(shí)時(shí)姿勢(shì)識(shí)別,并嘗試讓機(jī)器“知道”我們做出什么姿勢(shì)。姿態(tài)識(shí)別系統(tǒng)由DE10-Nano SoC FPGA Kit、攝像頭和HDMI監(jiān)視器組成。SoC FPGA 從攝像頭捕捉視頻流,通過(guò) CNN 模型識(shí)別人體姿態(tài),最后通過(guò) HDMI 接口顯示原始視頻和分類結(jié)果(站立、行走、揮手等)。
我們上傳我們的項(xiàng)目,包括 Matlab、Python 和 Quartus。
軟件版本:
Matlab r2017b
Python 3.6.3
Anaconda 5.1.0
TensorFlow-gpu 1.3.0
Quartus 14.0
同時(shí)在該倉(cāng)庫(kù)中含有作者的論文,論文中包含詳細(xì)的設(shè)計(jì)。
NPU_on_FPGA
https://github.com/cxdzyq1110/NPU_on_FPGA
目的 在FPGA上面實(shí)現(xiàn)一個(gè)NPU計(jì)算單元。能夠執(zhí)行矩陣運(yùn)算(ADD / ADDi / ADDs / MULT / MULTi / DOT等)、圖像處理運(yùn)算(CONV / POOL等)、非線性映射(RELU / TANH / SIGM等)。
優(yōu)點(diǎn) 考慮到靈活性較強(qiáng),易于修改網(wǎng)絡(luò)結(jié)構(gòu),適用于實(shí)現(xiàn)小型CNN/RNN網(wǎng)絡(luò)。
缺陷 由于指令串行執(zhí)行、缺少Cache導(dǎo)致外存讀寫(xiě)頻繁,運(yùn)算性能較低。
該項(xiàng)目也是上面項(xiàng)目的同一作者,詳細(xì)的設(shè)計(jì),完整的工程,值得去操作一下。
neural-engine
https://github.com/hollance/neural-engine
大多數(shù)新的 iPhone 和 iPad 都有神經(jīng)引擎,這是一種特殊的處理器,可以讓機(jī)器學(xué)習(xí)模型變得非常快,但對(duì)于這種處理器的實(shí)際工作原理,公眾知之甚少。
Apple 神經(jīng)引擎(或 ANE)是NPU的一種,代表神經(jīng)處理單元。它就像 GPU,但 NPU 不是加速圖形,而是加速卷積和矩陣乘法等神經(jīng)網(wǎng)絡(luò)操作。
ANE 并不是唯一的 NPU——除了 Apple 之外,許多公司都在開(kāi)發(fā)自己的 AI 加速器芯片。除了神經(jīng)引擎,最著名的 NPU 是谷歌的 TPU(或 Tensor Processing Unit)。
這個(gè)項(xiàng)目并不是一個(gè)實(shí)現(xiàn)CNN的項(xiàng)目,但是是一個(gè)關(guān)于Apple 神經(jīng)引擎(或 ANE)介紹及相關(guān)文檔的集合的項(xiàng)目。
總結(jié)
今天介紹了N個(gè)CNN的項(xiàng)目,前面的項(xiàng)目比較“單薄”,只適合學(xué)習(xí)CNN設(shè)計(jì),從NTHU-ICLAB(包含)之后的項(xiàng)目更適合實(shí)踐,因?yàn)檫@些項(xiàng)目都有詳細(xì)的設(shè)計(jì)文檔及板卡驗(yàn)證過(guò)程。
結(jié)合之前的TPU及今天的相關(guān)項(xiàng)目,大家應(yīng)該對(duì)神經(jīng)網(wǎng)絡(luò)應(yīng)該不會(huì)再恐懼了,下一篇文章我們將介紹一些DNN項(xiàng)目,將這個(gè)系列完善一下。
最后,還是感謝各個(gè)大佬開(kāi)源的項(xiàng)目,讓我們受益匪淺。后面有什么感興趣方面的項(xiàng)目,大家可以在后臺(tái)留言或者加微信留言,今天就到這,我是爆肝的碎碎思,期待下期文章與你相見(jiàn)。
審核編輯 :李倩
-
濾波器
+關(guān)注
關(guān)注
162文章
8139瀏覽量
182138 -
cnn
+關(guān)注
關(guān)注
3文章
354瀏覽量
22748 -
卷積神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
4文章
369瀏覽量
12311
原文標(biāo)題:優(yōu)秀的 Verilog/FPGA開(kāi)源項(xiàng)目介紹(二十一)- 卷積神經(jīng)網(wǎng)絡(luò)(CNN)
文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論