FPGA - lenet5 - 卷积模块

222 阅读4分钟

image.png

3个卷积 两个平均池化层 两个全连接层 -- 7层网络

卷积模块

在并行度,速度和资源占用进行权衡,更高并行意味着功耗更大,硬件资源占用更多,但可以提升速度。

2D filter

在卷积的过程中,过滤器与数据在channel方向分别卷积,之后将卷积后的数值相加。

TauH Activation

双曲正切函数,等于双曲余弦 除双曲正弦。

tanh相比sigmoid收敛更快

image.png

image.png

image.png

红线为其导数,优点是:

1 函数输出以(0,0)为中值。

2 收敛速度比sigmoid更快

softmax Activation

LeNet-5 网络的最后一层是softmax激活层,输入为全连接层的10个值,然后输出最终的分类结果。

Average Pooling

平均池化层,该网络具有两层平均池化层,作用是下采样卷积层输出,在减小数据量的同时,尽可能保存提取的特征。

Integrating Network

将所有的模块连接到一起,然后调通控制通路和数据通路。

Emulation 验证思路

1 用python/C++ 实现与模块相同功能的函数

2 为硬件模块和软件函数搭建对应的tsetbench ,记录输出结果

3 对比两套输出数据是否一致,并随机抽取样本进行转换验证

4 若发现错误,debug,修改代码逻辑

image.png

1 卷积层设计

卷积 激活函数 池化 卷积 激活函数 池化 卷积 激活函数

image.png

image.png

1 block diagram

将复杂模块分为多个子模块

自顶向下构成

multi filter layer

一个卷积层,有多个filter,也称为卷积核,image输入到不同的filter,得到包含不同特征的feature map。

image.png

image.png

image 32x32 x16 = 16384 所以输入位宽为16384

filters: 的位宽为2400bit位

filters:5x5x6 x16

5x5卷积核,6个,位宽为16

convLayerMulti:

输入信号 clk reset filters image

输出为feature map 28x28x16

不考虑padding时候,输出为输入图片尺寸 - 卷积核尺寸 除以卷积核的步长S。 最后加1。 image.png

single filter layer

image.png

单个filter,输入inmage,输出filter。

由RFslector 和 CU conv unit组成。

image.png

filters: 400位宽。5x5x16 单个filter

CU convolution Unit

image.png

每个卷积核的图像窗口与输入图像进行卷积,得到特征图。

image.png

image为400 位宽。 和filter大小一致。

processing element

image.png

CU由 PE组成。

PE为处理模块,卷积所进行的具体操作为点乘,本质是乘法和加法。输入为float类型。 硬件实现是定点数。

image.png

PE 功能 解析

image.png

floatMult16: 执行两个半精度浮点数的乘法

floatAdd16: 执行两个半精度浮点数的加法

半精度浮点数FP16:

符号 1bit。指数位5位。小数位10位。

number = (-1)^s X 1.M X 2^(E-15)

S为符号位,M为小数位,E为指数位。

result reg

result reg 作用:

将电路的组合逻辑转为同步时序电路,保证数据的同步。

乘法器和加法器后,加入寄存器,缓存。在下一个结果到来之后,结果更新。


module processingElement16(clk,reset,floatA,floatB,result);

parameter DATA_WIDTH = 16;  //数据位宽

input clk, reset;
input [DATA_WIDTH-1:0] floatA, floatB;
output reg [DATA_WIDTH-1:0] result;

wire [DATA_WIDTH-1:0] multResult;
wire [DATA_WIDTH-1:0] addResult;

floatMult16 FM (floatA,floatB,multResult); // 计算乘法结果
floatAdd16 FADD (multResult,result,addResult);  //将乘法结果累加

always @ (posedge clk or posedge reset) begin
	if (reset == 1'b1) begin
		result = 0;
	end else begin
		result = addResult;
	end
end

endmodule

CU功能解析

Conv Unit:

窗口,卷积核filter和输入image计算。

一个窗口卷积出一个计算结果,convUnit作用是 循环使用PE完成一个窗口的卷积计算,并输出最终结果。

循环使用PE减小硬件资源占用。

两个5x5矩阵相乘:

计算周期为:

1(复位) + 25(计算) +1(输出)

25次乘法和加法运算。

single filter layer 功能解析

由RFselector 和 CU组成。

执行一个filter与完整的image的卷积操作。

输出feature map。

RFselector: 作用是对已经展开的一维image tensor进行数据重排,再对应分发给n个(横向卷积并行度)CU进行窗口卷积。

缩小为5x5 image,如2x2的窗口。

需要进行数据窗口生成。
image.png

multi filter layer 功能解析

执行多个filter 与完整image的卷积操作,输出多个feature map。

计算并行度由例化的single filter layer个数决定。此处为两个。

顶层接口信号:

image.png 输出位宽为 28x28 x6x16 = 75264 bit

image.png

每次执行两个filter与image的卷积。分三次执行完。

float 16

float 16又称半精度 用16个比特也就是2个字节表示一个数。

其中1位符号位, 5位指数位, 10位小数位。

a 符号位: 1代表负数, 0代表正数。

b 指数部分,5个比特位, 全0和全1有特殊用途,所以是00001~11110, 也就是1到30, 减去偏置15,指数部分最终范围为-14 ~15.

c 小数部分, 10个比特位, 范围为(0~1023)/1024.

image.png