如何设计轻量级神经网络以处理?
摘要:引言 深度神经网络模型被广泛应用在图像分类、物体检测等机器视觉任务中,并取得了巨大成功。然而,由于存储空间和功耗的限制,神经网络模型在嵌入式设备上的存储与计算仍然是一个巨大的挑战。 目前工业级和学术界设计轻量化神经网络模型主要有4个方向:
引言
深度神经网络模型被广泛应用在图像分类、物体检测等机器视觉任务中,并取得了巨大成功。然而,由于存储空间和功耗的限制,神经网络模型在嵌入式设备上的存储与计算仍然是一个巨大的挑战。
目前工业级和学术界设计轻量化神经网络模型主要有4个方向:
人工设计轻量化神经网络模型
基于神经网络架构搜索(Neural Architecture Search,NAS)的自动化设计神经网络
CNN模型压缩
基于AutoML的自动模型压缩
本文首先介绍基本卷积计算单元,并基于这些单元介绍MobileNet V1&V2,ShuffleNet V1&V2的设计思路。其次,最后介绍自动化设计神经网络的主流方法和基本思路。最后概述CNN模型压缩的主要方法,详细说明基于AutoML的自动模型压缩的相关算法:AMC、PockFlow以及TensorFlow lite的代码实现。
基本卷积运算
标准卷积
卷积层的 输入为$(N,C_{in},H_{in},W_{in})$。输出为 $(N,C_{out},H_{out},W_{out})$,其中$H_{\text{out}}$和$W_{\text{out}}$分别为特征图的高度和宽度。卷积核(Kernel)的高和宽:$K[0]$和$K[1]$
$$FLOPS=(C_{in}*K[0]·K[1])*H_{\text{out}}·W_{\text{out}}*C_{out}\quad(考虑bias)$$
输出特征图中有$H_{\text{out}}*W_{\text{out}}*C_{out}$个像素;每个像素对应一个立体卷积核$k[0]*k[1]*C_{in}$在输入特征图上做立体卷积卷积出来的;而这个立体卷积操作,卷积核上每个点都对应一次MACC操作
图3标准卷积:空间维度和通道维度示意图
吃个例子
输入shape为(7*7*3),卷积核大小为(filter size)(3*3*3),卷积核个数(filter num \ channel_out)为2,输出shape为(3*3*2)。
Grouped Convolution
分组卷积是标准卷积的变体,其中输入特征通道被为G组(图4),并且对于每个分组的信道独立地执行卷积,则分组卷积计算量为标准卷积计算量的1/G:
$$FLOPS=\frac{(C_{in}*K[0]*K[1])*H_{\text{out}}*W_{\text{out}}*C_{out}}{G}$$
分组卷积:空间维度和通道维度示意图
Depthwise convolution
引用:Chollet F. Xception: Deep learning with depthwise separable convolutions[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 1251-1258.
Depthwise convolution 是指将输入特征图$(batch\_size, H\_{in}, W\_{in}, C\_{in})$分为group组,Group=$C\_{in}$(既Depthwise 是Grouped Convlution的特殊简化形式),然后每一组做k*k卷积,Depthwise convolution的计算量为普通卷积的$1/C_{in}$,通过忽略通道维度的卷积显著降低计算量
$$FLOPS=K[0]*K[1]*H_{\text{out}}*W_{\text{out}}*C_{in}$$
Depthwise相当于单独收集每个Channel的空间特征。
Depthwise卷积:空间维度和通道维度示意图
pointwise convolution
Pointwise是指对输入$(batch\_size, H\_{in}, W\_{in}, C\_{in})$做$k$个普通的 1x1卷积,主要用于改变输出通道特征维度,相当于在通道之间“混合”信息。Pointwise计算量为
$$FLOPS=H_{\text{out}}*W_{\text{out}}*C_{in}*C_{out}$$
Pointwise卷积:空间维度和通道维度示意图
Channel Shuffle
Grouped Convlution导致模型的信息流限制在各个group内,组与组之间没有信息交换,这会影响模型的表示能力。因此,需要引入group之间信息交换的机制,即Channel Shuffle操作。
