基于FPGA的一维卷积神经网络CNN的实现资源分配

Posted Crazzy_M

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于FPGA的一维卷积神经网络CNN的实现资源分配相关的知识,希望对你有一定的参考价值。

资源分配

环境:Vivado2019.2。
Part:xcku040-ffva1156-2-i,内嵌DSP个数 1920个,BRAM 600个也就是21.1Mb。

说明:通过识别加高斯白噪声的正弦波、余弦波、三角波较简单的实例来利用FPGA实现一维CNN网络,也就是将下列数据传输至FPGA,识别出下面哪些是正弦波、余弦波、三角波,通过简单实例实践,从而实现更复杂的网络。主要是实现CNN网络的搭建,本文因为追求速度利用了大量的DSP,后期加入复杂网络进行DSP复用。

第一节:基于FPGA的一维卷积神经网络CNN的实现(一)框架
第二节:基于FPGA的一维卷积神经网络CNN的实现(二)资源分配


再次认识整个网络,第一层卷积核、第一次池化是串行执行,第一层池化和第二层卷积是并行执行,第二层池化、第三层卷积、全连接是并行执行。

接下来就各层分析以下资源消耗情况

一、DSP资源分配

我们知道,卷积主要做的是乘加运算,FPGA加速主要是通过内嵌的DSP资源去做这些乘法。

DSP? 啥

①27bit预加器(加法器)
②27*18乘法器
③可以做加(减)法器,累加(减)器,逻辑运算(与或非)
④模式探测器,主要实现带掩膜的数据比较,上下溢出检测,记到一定数据对结果进行重置功能。
⑤数据选择器

例如如下模型,卷积核通道为1,卷积核元素为3个,需要的乘法器为3个,也就是需要3个DSP。

我们所设计的网络

1.第一层卷积

第一层卷积:1通道,6个卷积核,卷积核内的元素为5,卷积所需要的的乘法器为1×6×5=30,那么我们所需的DSP资源为1×6×5=30个。

2.第二层卷积

第二层卷积:6通道,16个卷积核,卷积核内的元素为5,卷积所需要的的乘法器为6×16×5=480,那么我们所需的DSP资源为6×16×5=480个。

3.第三层卷积

第三层卷积:16通道,16个卷积核,卷积核内的元素为5,卷积所需要的的乘法器为16×16×5=1280,那么我们所需的DSP资源为16×16×5=1280个。

4、全连接层

全连接层:理论上是将第三层卷积的16条通道25点的结果拼接成一条400点的数据输出,然后分别和3条400点的权重相乘相加得到3个结果R1、R2、R3,但是这样串行的去相乘相加无疑很耗时间。

但是我们用的可是可以并行的FPGA,出来的并行数据为何要连接成串行计算呢?

我们何不把权重(事先存储的参数数据,想咋存都由你,或者外部传输进去的数据,想怎么传还是由你)也构造成这种形式,让地三层卷积16通道结果出来的同时就立马可以分别和3个通道对应的权重相乘相加,这不就达到了并行的结果。


这样所需要的的乘法器为就为16×3,也就是DSP所需16×3=48个。

5.总结

层级特征使用DSP个数
第一层卷积1通道、6个卷积核、卷积核元素为51×6×5=30
第二层卷积6通道、16个卷积核、卷积核元素为56×16×5=480
第三层卷积16通道、16个卷积核、卷积核元素为516×16×5=1280
全连接第三层16通道卷积的输出,分别乘加3个16通道权重16×3=48
1838

对比一下资源使用表:

DSP资源没这么多的时候,就考虑复用。

二、BRAM资源

每层所需的权重参数本设计是暂存在ROM中,而ROM所占用的资源为BRAM资源,后续复杂网络,权重参数可能会通过PCIE总线进行传输。

所谓的权重参数就是每个卷积核、每条卷积核相应的偏置,全连接参数、偏置。

1.第一层卷积

第一层通道为1,卷积核个数为6,卷积核元素为5。那么第一层卷积参数就为6×5=30,别忘了每个卷积最后的结果都会加一个偏置,也就是一条卷积核卷积完成后的结果上整体去加上这个偏置,所以偏置个数为6,那么第一层所需的参数为6×5+6=36。

比如该设计的第一层的1通道16个卷积核,卷积核元素个数为5的参数:

-0.41392267	 -0.37628385	-0.38678840	   -0.10021902	-0.42755467
0.46177748	  0.47878936	-0.011841099	0.36656979	-0.33966425
0.19130668	  0.14565417	-0.17707989	    0.26029965	 0.29681087
-0.29763651	 -0.37699795	 0.35222396	   -0.20345914	-0.37277707
-0.36939585	  0.19159849	-0.23786691	   -0.37849170	-0.44727486
-0.075469948 -0.18664657	-0.30474073	   -0.23001774	-0.098302089

比如该设计的第一层6个卷积核对应的偏置参数:

-0.16858324	-0.25512469	-0.27672836	-0.19529539	0.45146680	0.46845901

2.第二层卷积

第二层通道为6,卷积核个数为16,卷积核元素为5。那么第二层卷积参数就为6×16×5=480,偏置个数为16,那么第二层所需的参数为6×16×5+16=496。

比如该设计的第二层的6通道16个卷积核,卷积核元素个数为5参数:

val(:,:,1) =

   -0.1547    0.2032    0.1963   -0.1448   -0.1131
    0.1735    0.1296    0.1969    0.2054   -0.0226
   -0.0928   -0.0498    0.2513    0.0210   -0.0890
    0.0415   -0.0431    0.1257    0.1251    0.1287
    0.0116    0.1061   -0.1738    0.1131   -0.0005
   -0.1320    0.0712    0.0488    0.0231    0.0075


val(:,:,2) =

    0.1026   -0.0004    0.0034   -0.0461    0.1522
   -0.1177   -0.0905    0.0413   -0.1417   -0.1348
    0.0588    0.0095    0.0238   -0.0664   -0.1272
   -0.0614    0.0279   -0.1217   -0.0029    0.0752
    0.0962   -0.1873    0.0188   -0.1346    0.0241
   -0.1899   -0.1165   -0.0286    0.1052    0.1000


val(:,:,3) =

   -0.2075    0.0816   -0.1127    0.0045   -0.0761
    0.2506    0.2455   -0.0971   -0.0761   -0.0129
    0.2404   -0.0074    0.0966   -0.0890   -0.0007
    0.0926    0.1140    0.1104   -0.0333    0.0803
   -0.0943    0.0773    0.1850    0.0859   -0.0638
   -0.1796   -0.0393   -0.0565   -0.1135   -0.0263


val(:,:,4) =

   -0.0133   -0.0443   -0.0063   -0.0984    0.0493
    0.1532    0.1724   -0.0733   -0.0340   -0.0326
   -0.0105    0.1516   -0.0407   -0.0529   -0.0170
   -0.1523    0.0605   -0.0966   -0.0619   -0.1496
   -0.1155   -0.0049   -0.1252    0.1687    0.2154
   -0.1118   -0.0710   -0.0020    0.0922    0.2124


val(:,:,5) =

   -0.0509    0.0435   -0.0144    0.1848    0.0542
    0.2265    0.0743    0.1912    0.0046   -0.0996
   -0.0427   -0.1315   -0.0471    0.0246   -0.0847
    0.1970   -0.1339   -0.1562   -0.0466    0.1271
   -0.1135   -0.0592   -0.1675    0.0143    0.0434
    0.0487   -0.1833    0.0461    0.1186   -0.1582


val(:,:,6) =

   -0.0779    0.1322    0.2086    0.1222    0.0509
   -0.1968   -0.1623    0.0085   -0.0786    0.0393
    0.0522   -0.0438   -0.1044   -0.0294   -0.0912
    0.1010    0.2230    0.1075    0.0100   -0.0050
    0.1049    0.1498    0.0103    0.1068    0.1174
   -0.0630    0.1601   -0.0098    0.1374    0.2107


val(:,:,7) =

    0.0782   -0.0438   -0.1652    0.0035    0.0205
    0.2311    0.0875   -0.1125    0.0758    0.1435
   -0.0878    0.0090    0.0917   -0.1049   -0.1181
    0.1242   -0.0596   -0.0068    0.1177   -0.0373
    0.0162    0.0092   -0.1835   -0.0169   -0.0970
   -0.0093   -0.0643    0.1495    0.1413    0.0363


val(:,:,8) =

    0.1482   -0.1471    0.0542    0.0859   -0.1110
   -0.0803    0.1438    0.0147   -0.0928    0.0743
    0.1344    0.1544    0.1804    0.1789    0.1898
   -0.0955   -0.1667   -0.1229   -0.2301   -0.0559
    0.1493   -0.1870   -0.0373   -0.0948    0.0036
   -0.0054   -0.1074    0.0519    0.0120   -0.1034


val(:,:,9) =

    0.0590    0.0746   -0.1623    0.0310    0.5379
    0.1085   -0.0050   -0.1275   -0.0404    0.1794
   -0.0571    0.0902    0.1722   -0.0147    0.1321
    0.0155   -0.0003   -0.1564    0.1006   -0.0344
    0.1347    0.0920   -0.0719   -0.0287   -0.1190
   -0.1014    0.0934    0.0186   -0.1601   -0.1939


val(:,:,10) =

   -0.2035    0.0999   -0.1322    0.0682   -0.1048
    0.0995   -0.0815    0.1874   -0.1160    0.0260
   -0.1675   -0.1447   -0.1530    0.0755    0.0486
   -0.0879   -0.1178   -0.0372   -0.0689   -0.1216
   -0.1669   -0.0752    0.1888    0.0595   -0.0050
    0.0705    0.0905   -0.0413    0.1929    0.2123


val(:,:,11) =

   -0.0955    0.0658   -0.1620   -0.1087    0.0680
    0.2258    0.0300    0.1886   -0.0921   -0.0557
    0.1444    0.2510    0.1219   -0.0504    0.1861
   -0.1379    0.0132   -0.0342   -0.1072    0.0732
   -0.1169   -0.0613   -0.0702   -0.0899    0.0119
    0.0052   -0.1169   -0.0318   -0.0550    0.1045


val(:,:,12) =

    0.0427   -0.1520   -0.1143    0.0906    0.0012
    0.1343   -0.0920    0.1269    0.2326   -0.0352
    0.1491   -0.0491    0.0240    0.1408    0.2117
   -0.1461   -0.0904   -0.0562    0.1058   -0.1816
   -0.1743   -0.1477    0.0440   -0.0306    0.0281
    0.0376    0.0546   -0.1762    0.1463   -0.0549


val(:,:,13) =

    0.0388   -0.0922    0.0928    0.2161   -0.0026
   -0.0745   -0.0247    0.0622    0.1282   -0.1368
    0.1207   -0.0654   -0.0275    0.0763   -0.0236
    0.0025    0.0647    0.0925    0.1709   -0.0178
    0.1661    0.2081    0.2127    0.1999   -0.0897
    0.2426    0.2030    0.1917    0.1966    0.0323


val(:,:,14) =

   -0.0539    0.0233    0.0674   -0.0673    0.0012
    0.2553    0.0010    0.0550   -0.0045    0.2548
    0.1157    0.1743    0.0559    0.0050    0.2136
   -0.1661    0.1464   -0.0778   -0.0510   -0.1443
   -0.1775    0.1052   -0.0368   -0.1283    0.0468
    0.1562    0.0844   -0.1260   -0.0319   -0.1913


val(:,:,15) =

    0.0088   -0.0439    0.1869    0.2156    0.0045
   -0.0056   -0.1742   -0.0575   -0.0640    0.1588
   -0.1746    0.0565   -0.1516   -0.1399   -0.1901
   -0.0961    0.1196    0.0038   -0.1159    0.0634
    0.0062    0.1950    0.1605   -0.0952    0.1356
    0.2200    0.1404    0.1234    0.1719   -0.1164


val(:,:,16) =

   -0.0263   -0.0728   -0.0043    0.1152    0.2091
    0.1518    0.1548    0.0271    0.1760   -0.0435
    0.1513    0.1026    0.0266    0.0744    0.2038
    0.2373   -0.0509    0.0985    0.2076    0.1432
    0.1513    0.0789    0.1683    0.0555   -0.1111
    0.0974   -0.0354   -0.0795    0.0350    0.0588

第二层16个卷积核对应的偏置:

0.23936687	-0.10661833	0.15271537	0.061077386	0.016900102	-0.069750383	0.11862857	0.083581999	0.081415482	0.034861937	-0.032691609	-0.022287890	0.025896503	-0.085885495	0.035965338	0.23867875

3.第三层卷积

第三层通道为16,卷积核个数为16,卷积核元素为5。那么第二层卷积参数就为16×16×5=1280,偏置个数为16,那么第三层所需的参数为16×16×5+16=1296。

比如该设计的第三层的16通道16个卷积核,卷积核元素个数为5参数:


val(:,:,1) =

   -0.0300    0.0059    0.0910    0.0358    0.0334
   -0.0742    0.0914    0.0439    0.0247   -0.0544
   -0.0398   -0.0362   -0.0330    0.0634    0.0675
   -0.0858    0.0750   -0.0045   -0.0618   -0.0959
   -0.0090   -0.0846   -0.0634    0.0602   -0.0818
   -0.0337    0.0238    0.0320    0.0828    0.0617
    0.0066    0.0813    0.0713    0.0830   -0.1103
   -0.0977   -0.0097   -0.0735   -0.1122   -0.0822
   -0.0529   -0.0054   -0.0204    0.0529    0.0055
    0.0368   -0.0193    0.0703   -0.0231    0.0488
    0.1028   -0.0910   -0.0572    0.0877   -0.0683
   -0.0951    0.0384   -0.0784    0.1030   -0.0543
   -0.0076   -0.0692   -0.0111   -0.0090   -0.1038
   -0.0101    0.0348   -0.0650   -0.0731    0.0312
    0.0617   -0.0485    0.0893    0.0533   -0.0878
   -0.1151   -0.0369    0.0463   -0.0897    0.0195


val(:,:,2) =

    0.0641   -0.0588    0.1316    0.0727   -0.0295
   -0.0841   -0.0773   -0.0449   -0.0536   -0.0172
    0.0094    0.1279    0.1216   -0.0060   -0.0594
   -0.0335   -0.0194   -0.0694    0.1204   -0.0149
   -0.0271   -0.0577    0.0736    0.0085    0.1281
    0.0555   -0.0624   -0.0687    0.0265   -0.1115
   -0.0136    0.1482    0.0274    0.1024    0.1446
    0.1067   -0.0112    0.0499    0.0713    0.1445
    0.0596    0.0408   -0.0414   -0.0581    0.1377
   -0.0766    0.1030    0.0912    0.1598   -0.0158
    0.0247    0.0604    0.0507    0.0489    0.0257
    0.0949    0.0817    0.0412    0.1432    0.1386
   -0.0829    0.0827   -0.0143   -0.0725    0.1077
    0.1112    0.0524    0.1122    0.1327    0.0742
    0.0612    0.0809   -0.0110   -0.0770   -0.0872
    0.0663    0.0551   -0.0028   -0.0466   -0.0694


val(:,:,3) =

    0.1621    0.1361    0.1264    0.0486    0.1578
    0.0686   -0.0030    0.0562    0.0578   -0.0606
    0.1117   -0.0091    0.0875    0.0292    0.0210
   -0.0238    0.0865    0.0586    0.0414    0.0604
    0.0991    0.0854    0.0122    0.1483    0.0661
    0.0067   -0.1624   -0.1576   -0.0880   -0.0573
    0.0110    0.0292    0.1067    0.0781   -0.0308
    0.0861    0.1249    0.1486   -0.0215   -0.0297
    0.1563    0.0907    0.0150    0.1034   -0.0060
   -0.0581   -0.0311   -0.1056   -0.0522    0.0454
    0.0818    0.0634    0.1742   -0.0090    0.1096
    0.1358    0.1414   -0.0403    0.1785    0.0387
    0.0490   -0.0404   -0.0886   -0.0397   -0.0205
    0.1462    0.0797    0.1563   -0.0141   -0.0230
   -0.1314    0.0173   -0.1656   -0.0656    0.0776
    0.1302    0.0702    0.0675    0.1705    0.1217


val(:,:,4) =

    0.0640   -0.0430    0.1049   -0.0082    0.1085
   -0.1171   -0.0675    0.0608   -0.0063   -0.0495
   -0.0777   -0.0361   -0.0731   -0.0087    0.1168
   -0.0917    0.0220   -0.0561   -0.0674   -0.0525
    以上是关于基于FPGA的一维卷积神经网络CNN的实现资源分配的主要内容,如果未能解决你的问题,请参考以下文章

FPGA教程案例57深度学习案例4——基于FPGA的CNN卷积神经网络之卷积层verilog实现

FPGA教程案例59深度学习案例6——基于FPGA的CNN卷积神经网络之整体实现

FPGA教程案例58深度学习案例5——基于FPGA的CNN卷积神经网络之图像缓存verilog实现

FPGA教程案例56深度学习案例3——基于FPGA的CNN卷积神经网络之池化层verilog实现

FPGA教程案例55深度学习案例2——基于FPGA的CNN卷积神经网络之ReLu激活层verilog实现

FPGA教程案例54深度学习案例1——基于FPGA的CNN卷积神经网络之理论分析和FPGA模块划分