基于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个卷积核、卷积核元素为5 | 1×6×5=30 |
第二层卷积 | 6通道、16个卷积核、卷积核元素为5 | 6×16×5=480 |
第三层卷积 | 16通道、16个卷积核、卷积核元素为5 | 16×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实现