14

碎碎思 · 2022年01月06日

优秀的 Verilog/FPGA开源项目介绍(十四)使用FPGA实现LeNet-5 深度神经网络模型

简介

LeNet-5:是Yann LeCun在1998年设计的用于手写数字识别的卷积神经网络,当年美国大多数银行就是用它来识别支票上面的手写数字的,它是早期卷积神经网络中最有代表性的实验系统之一。

LenNet-5共有7层(不包括输入层),每层都包含不同数量的训练参数,如下图所示。
image.png
LeNet-5中主要有2个卷积层、2个下抽样层(池化层)、3个全连接层3种连接方式。

项目简介

https://github.com/lulinchen/cnn_open

该项目是通过 FPGA 实现硬件 CNN 结构的尝试。
代码由 Verilog/SystemVerilog 编写,并使用 Vivado 在 Xilinx FPGA 上合成实验。
该代码只是功能的实验性代码,并未完全优化。

FPGA板卡介绍

Xilinx KCU105 Board

https://china.xilinx.com/products/boards-and-kits/kcu105.html
image.png

CNN实现结果

仅实现了 4 个基本模块:

  • conv,这个模块执行卷积计算,全连接也和卷积一样处理,内核大小等于输入数据大小。
  • The max_pool
  • The relu
  • 迭代器(The iterator),在输入数据周围跑,并馈送至计算单元。

演示

image.png
LeNet 使用上诉 4 个基本模块构成,权重和偏差存储在 ROM 中编码(这也是纯FPGA实现CNN的难点,参数不好修改和存储)。

参考 Tenserflow Lenet 代码,来自CarND-LeNet-Lab(https://github.com/udacity/CarND-LeNet-Lab)。

Xilinx KCU105 Board,采用HDMI输入输出子板。
通过 HDMI 电缆将 PC 连接到 HDMI 输入节点。

一个 32x32 大小的输入从 PC 屏幕输出中裁剪出来,然后输入 Lenet。分类结果显示在 HDMI 输出上。

下图截自FPGA的HDMI输出。白色矩形是由 FPGA 绘制的。将Mnist 数字图片移动到矩形中,或使用Paint 软件手动绘制一个数字。矩形下方打印的数字为分类结果。
image.png

参考
原始的软件代码参考:
1、https://github.com/udacity/CarND-LeNet-Lab
2、https://github.com/udacity/CarND-Term1-Starter-Kit

总结

到底纯FPGA适不适合这种大型神经网络的设计?这个问题其实我们不适合回答,但是FPGA厂商是的实际操作是很有权威性的,现在不论是Intel还是Xilinx都没有在自己传统的FPGA上推广AI,都是在基于FPGA的SoC上推广(Vitis和OpenVINO,前者Xilinx后者Intel),总结来看就是:纯 RTL 硬件设计不是AI的好选择。特别是对于大规模网络,权重和中间结果需要存储在外部存储器中。并且数据迭代器会更加复杂。设计周期长,AI相关领域迭代速度快,综上以上几点,可以很容易给你们指引一条道路。

最好使用通用或专用处理器来做控制工作,让硬件来执行计算(加速的概念)。

综上,此项目仅仅适合需要了解相关概念的朋友参考,不建议深入,一些简单的算法可以深入学习一下,推荐下面的项目:

https://github.com/suisuisi/FPGAandCNN/tree/main/DigitalRecognition
原文:OpenFPGA
作者:碎碎思

相关文章推荐

更多FPGA技术干货请关注FPGA 的逻辑技术专栏。
推荐阅读
关注数
10511
内容数
513
FPGA Logic 二三事
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息