老白的白

tech blogs in Zhihu

View on GitHub

关于MATLAB神经网络生成HDL的实例

感谢TM同学的信息以及验证

昨天有同学跟我说Matlab 2018b更新了一个实例,讲解如何使用定点化函数来生成神经网络算法的HDL代码,实例链接如下。下面就这个Example,我来讲讲我的一些看法。

Convert Neural Network Algorithms to Fixed-Point using fxpopt and Generate HDL Code

先搬出观点:

这个实例更多的在于知道使用Matlab的定点化工具,并不适用于一般我们认为的深度神经网络的HDL生成 对于浅神经网络(shallow neural network)或者多层感知机(multi-layer perceptron)的HDL代码生成,这个还是很有用的

下面简单说下这个实例:

在MATLAB输入命令“edit fxpoptdemo_neural_networks_script”,就会出现本例的所有脚本。这个脚本大致可以分成以下部分

浮点模型自动生成 基于浮点模型的定点化改进 定点化工具使用 生成HDL代码 首先,1-47行实现的是浮点模型的自动生成,本质上就是调用Neural Network Pattern Recognition App,导入Example Data Set - engine_dataset,训练并且生成Simulink模型。

其次,要根据定点化的原则Best Practices for Fixed-Point Workflow来一方面对于之后的定点化做准备,另一方面将HDL Coder无法识别的模块转换成可识别的模块(部分)。比如图1为浮点模型的Process Input 1模块,图2为定点/可转换成HDL的模块(此处很大可能是由MATLAB代码生成的Simulink模块)。

图1 浮点模型的Process Input 1模块
图2 定点模型的Process Input 1 模块

将图2稍作整理后,我们可以看出(图3),其实现的功能和图1完全一样。只不过整理后的模块全部支持HDL工具箱

图3 整理后的定点模型的Process Input 1 模块

应用时,这部分需要用户自行对不同模块进行编辑。所以对于大规模的神经网络,这一步会非常麻烦。可供选择的方法有使用MATLAB code进入需要改动的Simulink模块进行操作,但这一步非常繁琐复杂,即使Mathworks工程师也并不推荐这种方法。有兴趣的同学可以参考一下链接

【1】Building Models with MATLAB Code

【2】Programmatic Modeling Basics

也有一些并没有转换的,比如第一层中的tansig函数,之后会使用LUT来实现。

从113行开始,将会对activation function进行优化,使用LookUp Table代替tansig函数。并且对替代函数进行验证。BreakpointSpecification选用EvenPow2Spacing,LUT模块会自动根据输入进行divider-free插值,大大减少对于片上资源的消耗。

下面谈谈感想:

这个实例提供了一个定点化的流程以及基本技巧,对于不需要循环的浅网络计算有很大的指导意义,对于循环计算的效果还有待验证,毕竟误差在循环中会累计。这个例子中需要手动修改的模块过多,weight和bias都是直接在模块中设置,实现深度网络的时候会要花费大量时间修改。Mathworks会在不久的将来发布deep learning HDL toolbox,到时候对于深度神经网络的HDL实现会变得更加容易。其实对于一般的神经网络完全可以使用HDL Coder自己实现,卷积可以使用Vision HDL toolbox里的image filter实现,累加器使用HDL Coder中的sum+delay模块实现,fully connected使用matrix multiplication模块实现。难度在于如何与DDR一起工作来降低片上BRAM的使用量。

back