1.MNASnet算法介绍
MNASnet是一种轻量化的神经网络,其基于autoML生成,用于实现图像分类任务,Pytorch的torchvision库中有MNASnet乘各种系数的官方实现。在ImageNet-1K测试集下,各种系数(系数乘在channel维度)的准确率和权值量如下所示:
| 通道系数 | TOP1准确率 | TOP5准确率 | 参数量 |
|---|---|---|---|
| 0.5 | 67.734% | 87.49% | 2.2M |
| 0.75 | 71.18% | 90.496% | 3.2M |
| 1.0 | 73.456% | 91.51% | 4.4M |
| 1.3 | 76.506% | 93.522% | 6.3M |
MNASnet-0.5的参数量仅有2.2M,如果使用float16数据类型,总参数量也只有4.4MB,适合使用轻量级的FPGA实现,本次将尝试MNASnet-0.5网络映射到FPGA上。
2.关键算法组件
MNASnet结构中具有两个和硬件具有较大关系的算法组件,分别为:
-
深度可分离卷积:用于替代先升通道、再降通道的全点数卷积,常用于轻量化网络中,可以减少运算量和参数量
-
残差结构:ResNet中的残差结构,一个或多个卷积构成的卷积块的输出为卷积结果和输入值的加法,用于解决深层次网络的梯度消失问题,目前广泛应用在各类卷积神经网络中
2.1. 深度可分离卷积
深度可分离卷积如下图所示:
一次深度可分离卷积包括三次卷积,分别为:
-
Layer 1:1x1卷积,输入通道为Ci,输出通道为T,一般T>Ci,将输入的feature map做通道扩张
-
Layer 2:分组数为T的分组卷积,即每个通道为一组,一般为3x3或5x5卷积,stride为1或2(软池化),这种卷积的参数量和运算量都很低
-
Layer 3:1x1卷积,输入通道为T,输出通道为Co,一般T>Co,将分组卷积的feature map做通道恢复
另一种理解为1x1卷积处理不同通道之间的关系,分组卷积处理通道内部的信息。现在考虑参数量,这里一共有三个卷积,总参数量如下所示,其中K为分组卷积的卷积核尺寸,一般为3和5:
计算量(乘法次数)如下所示,其中W和H分别为输入/输出feature map的宽和高:
对比向扩展通道、再缩减通道的常规卷积而言,大大减少了参数量和运算量。
2.2. 残差结构
残差结构用于解决深度学习(多层神经网络)梯度消失的问题,将深度学习的层数从几十级推动到了几百级,现在已经成为了卷积神经网络的一种通用结构,其公式如下所示:
示意图如下图所示:
对于硬件实现而言,残差结构的加入提升了系统复杂度,主要包括:
-
计算上,需要增加两个张量对应位置相加的算子,且增加了次加法运算
-
存储上,不能运算一层丢一层,需要另外开辟存储空间存储输入feature map
3.MNASnet网络结构
3.1.网络结构
这里简述一下MNASnet的网络结构,用于后续需求的分析和硬件计算能力的确定。论文中,MNASnet的结构被简述为一张图片,如下所示:
网络基本由三类block和基本的卷积组件构成,这里实现的是channel*0.5版本的网络,具体参数与图中有一些差异,如下表所示:
| block | layer | 输入尺寸 | 运算类型 | 运算参数 | 参数数量 | 输入数据量 |
|---|---|---|---|---|---|---|
| B1 | conv-1 | 3x224x224 | conv | k3s2c16 | 432 | 148512 |
| B2 | conv-1 | 16x112x112 | dw-conv | k3s1c16 | 144 | 200704 |
| conv-2 | 16x112x112 | k1-conv | k1s1c8 | 128 | 200704 | |
| B3 | conv-1 | 8x112x112 | k1-dw-k1 | k3s2,C8-24-16 | 192+216+384 | 100352->301056->75264 |
| B4/B5 | conv-1 | 16x56x56 | k1-dw-k1 | k3s1,C16-48-16 | 768+432+768 | 50176->150528->150528 |
| add-1 | 16x56x56 | res-add | - | - | 150528x2 | |
| B6 | conv-1 | 16x56x56 | k1-dw-k1 | k5s2,C16-48-24 | 768+1200+1152 | 50176->150528->37632 |
| B7/B8 | conv-1 | 24x28x28 | k1-dw-k1 | k5s1,C24-72-24 | 1728+1800+1728 | 18816->56448->56448 |
| add-1 | 24x28x28 | res-add | - | - | 18816x2 | |
| B9 | conv-1 | 24x28x28 | k1-dw-k1 | k5s2,C24-144-40 | 3456+3600+5760 | 18816->112896->28224 |
| B10/B11 | conv-1 | 40x14x14 | k1-dw-k1 | k5s1,C40-240-40 | 9600+6000+9600 | 7840->47040->47040 |
| add-1 | 40x14x14 | res-add | - | - | 7840x2 | |
| B12 | conv-1 | 40x14x14 | k1-dw-k1 | k3s1,C40-240-48 | 9600+2160+11520 | 7840->47040->47040 |
| B13 | conv-1 | 48x14x14 | k1-dw-k1 | k3s1,C48-288-48 | 13824+2592+13824 | 9408->56448->56448 |
| add-1 | 48x14x14 | res-add | - | - | 9408x2 | |
| B14 | conv-1 | 48x14x14 | k1-dw-k1 | k5s2,C48-288-96 | 13824+7200+27648 | 9408->56448->14112 |
| B15/B16/B17 | conv-1 | 96x7x7 | k1-dw-k1 | k5s1,C96-576-96 | 55296+14400+55296 | 4704->28224->28224 |
| add-1 | 96x7x7 | res-add | - | - | 4704x2 | |
| B18 | conv-1 | 96x7x7 | k1-dw-k1 | k3s1,C96-576-160 | 55296+5184+92160 | 4704->28224->28224 |
| B19 | conv-1 | 160x7x7 | k1 | k1s1,C1280 | 204800 | 7840 |
| meas-1 | 1280x7x7 | - | k7 | - | 62720 | |
| fc-1 | 1280x1x1 | - | 1280->1000 | 1280000 | 1280 |
3.2.网络结构分析
从网络结构分析的表中可以发现,以下信息:
-
MNASnet尽可能的在网络的深层(feature map尺寸小)时进行多次计算
-
基本符合feature map越来越小,参数量越来越大的特征
-
在深度可分离卷积中,第二层(分组卷积层)和第三层(k1卷积层)的输入feature map很大,避免存储
-
随着网络层次的加深,在卷积参数量上,分组卷积层的比重越来越小,k1卷积层的比重越来越大
-
最大参数出现在B19-fc-1,参数量达到1.28M个,是个全连接层
-
最大feature map输入(不包括深度可分离卷积内部的卷积输入)出现在B2输入层,达到0.2M个
因此,对于FPGA加速器,提出了一下几点设计基础:
-
尽可能将深度可分离卷积中的三个卷积作为一个算子设计,并避免完全存储第二个和第三个卷积的输入feature map
-
需要权值和数据共享存储
-
权值存储需要更偏向便于K1卷积的参数提取,最多为55K个,而分组卷积的参数量最大仅有14K
-
非必要不进行重复计算,会影响加速效果(增加了网络的计算量)