卷积模块
多个卷积核的卷积层

完成一个卷积核对image的卷积运算,输出feature map。
一个卷积层包含多个filter,也可称为卷积核。image输入到不同的Filter,得到包含不同特征的feature map。filterSet通过选择不同的卷积核并行完成两个特征图的运算。
image是32x32的,filter是5x5的。

第一层卷积层C1,有filters长度为2400。第一层有6个卷积核,每个卷积核是5x5的,位宽是FP16,故线宽为6x5x5x16=2400。
image线宽为32x32x16=16384。
输出的feature map线宽为6x28x28x16=75264。
单个卷积核的卷积层

执行单个filter对image的卷积,输出对应的feature map(总结果)。

filter为单个卷积核线宽为5x5x16=400。
输出的feature map为28x28x16=12544
卷积单元

实现一次单个卷积核和image的卷积,输出对应的feature map(单次窗口卷积运算结果)

输出的feature map线宽为1x16,一次卷积是乘加,只得到一个FP16的结果。
基本运算单元:乘加

实现一次FP16的乘加,加法器是累加器。

功能分析
半精度浮点数(FP16)

$$
number=(-1)^s\times(1.M)\times2^{E-15}
$$
s:符号位;E:指数位;M:尾数位
浮点数加减法
本部分内容属于计算机组成原理,可参考网上资料得到算法。
1 |
|
浮点数乘法
本部分内容属于计算机组成原理,可参考网上资料得到算法。
1 |
|
FP16转hex的在线转换器:https://evanw.github.io/float-toy/
基本运算单元:乘加模块
完成FP16和FP16的乘加。代码使用串行的方式累加,而非加法树形式。因此只需每次计算出一个乘法结果,就自动累加。
1 |
|
卷积单元
完成5x5的FP16和5x5的FP16的乘加,即一个窗口的卷积。
根据上一个模块的分析,本模块只需要完成连续的5x5个FP16的乘加,输出的和即总的卷积结果。代码中使用循环变量i来依次切割相对应的image和filter做乘加。只有reset能让i置0,因此本模块的reset其实是开始信号。所花费的时钟周期为:5x5个乘加+1个输出=26(或者认为加法在乘法的下一个周期)。
要注意,image和filter都是每FP16为一个独立数据。
1 |
|
RFSelector模块和convLayerSingle模块
本模块十分重要,也比较难理解。
1、将一幅图像分成左右两部分
2、给定一个rowNumber和column(这个column就是左边部分0或者右边部分1),输出这个rowNumber的所有卷积所需的image部分(即FxFxD的大小,一个四方体) ,这个image部分是先按行排,再按depth排,再按列排。
3、输出即一个column的一行中包含的所有卷积所需的image部分。
每个column需要有(H-F+1)个rowNumber,每一个row有(W-F+1)/2个列。因此在convLayerSingle模块里
-
要例化(W-F+1)/2次卷积单元(第一层需14个),也即给定某行,其每一列的卷积是并行的通过截取receptiveField的部分来取出每个并行卷积所需要的image部分。
-
要循环rowNumber (H-F+1)次,即遍历每行,每行之间的运算是串行的。
-
在convLayerSingle模块,先算完一行中的两个column,再换到下一行计算。即column之间的卷积是串行的。
-
convLayerSingle模块完成一个filter对整幅图像的卷积
1 |
|
1 |
|
convLayerMulti模块
这个模块例化了2个convLayerSingle模块,实现了对两个filter核的并行卷积。
1 |
|
至此,一个卷积层所需的实现单元就完成了。剩下的问题就是怎么让卷积的image和filter数据对应输入并计算。
第三个卷积层后接FC层,每个核卷积只输出一个值(因为H=W=F),因此只需convLayerSingle即可(输出降了一维)。