lenet五层网络 包括三个卷积层 两个全局池化层 两个全连接层
lenet主要分为五个部分来实现,卷积模块 Tanh激活函数 softmax激活函数 平均池化层 全连接层
验证思路,在网络层设计阶段,通过对网络层输入输出大小进行验证和jupyter notebook 进行验证。 最终通过python实现与模块功能相同的函数,通过硬件模块和软件函数单间testbench,验证输出结果。
block diagram 将复杂模块分为子模块,lenet输入32x32,第一层卷积5x5x6,得到28x28x6feature map 经过2x2得到14x14x6 。 第二次卷积5x5x16,得到10x10x16,经过2x2平均池化,得到5x5x16。 第三次卷积5x5x120,得到1x1x120,经过全连接层第一层有84个输出节点,第二个全连接层有10个输出节点,再经过softmax归一化。
卷积模块由多个单层卷积核组成,单个卷积核通过 卷积运算单元。卷积运算单元,每个卷积核的图像窗口与输入图像进行卷积。卷积运算单元由处理模块组成,处理模块完成卷积需要的点乘和加法。此处设计了半精度浮点数的加法器和乘法器。半精度加法器完成对阶,尾数相加减,规格化并舍入,溢出判断。完成 加法器设计。阶码相加减,尾数相乘,规格化并舍入,判断溢出。完成乘法器设计。FP16最高位为符号位,然后指数位5位,小数位10位。符号位为1表示为负数。循环使用处理模块实现卷积窗口运算。
tanh反曲正切函数,e^x的泰勒展开来计算。四个乘法器和一个加法器。展开四项。首先获取x的增量,再乘以系数,再与之前的进行相加。
平均池化模块和全连接层,平均池化部分执行多通道的image平均池化,循环复用平均池化完成所有通道的平均池化。平均池化,取平均值,全并行化同时对所有窗口进行计算。插入寄存器形成流水线。 全连接层 一个乘法器,一个加法器,累乘之后累加。
softmax模块,对输入进行归一化,求出各类的概率。 1 指数运算 2 计算指数和 3 求出指数和倒数 4 求出每个元素的softmax值。 10个分类有10个指数模块,计算指数通过泰勒展开式实现。
卷积:
滑窗内并行。
多通道并行
多卷积核并行。
池化:多通道并行
全连接层:累乘后累加 采用的是乘加树。
模型解析模块:定义了一种用来存储预训练模型结构和数据的json文件。从json文件中解析除模型结构于数据。 数据量化模块将浮点数转为定点数数据,加速硬件计算。
实验环境:
本文再prcharm开发环境下训练,使用keras框架。模型训练和测试都使用的mnist数据集。
硬件实现基于Xilinx artix7 ZYNQ 7020
模型精确度测试。 读取mnist数据集数据,将数据的像素值存入数组中,10进制像素值转为16进制字符存入txt文件中,将数据真实标签存放在txt文件最后。当加速器进行预测,通过数据真实值判断预测结果正确与否。
时间大概为20微妙,准确度95%。
验证: FPGA验证xilinx vivado
1 获取模型结构和数据的。存储数据的txt文件。
2 使用modelsim进行功能仿真和时序仿真,生成bit流文件。
3 将bit流文件下载到fpga中,构建真正的硬件电路,并进行板级验证。
输入为图片的数据txt文件。
数码管输出结果3.在数码管显示类别。
片外权重。 将权重初始化到片上BRAM中。 将模型参数转化为COE格式,使用matlab将权重转为COE格式文件,并初始化到片上BRAM中。
输入直接读取txt。 后期用uart从上位机发送好点。