量化友好的可分离卷积:推动 MobileNets 在移动设备上的发展
2023-11-04 21:04:22
在移动设备上部署深度神经网络时,轻量化至关重要,而 MobileNetV1 是该领域的先驱。然而,它的量化效果却出人意料地差。为了解决这一难题,高通提出了量化友好的可分离卷积,取得了显著的成效。
MobileNets 的量化困境
量化是将浮点权重和激活转换为低精度格式(如 int8)的过程,可以显着减少模型大小和推理成本。然而,MobileNetV1 在量化后表现不佳,精度下降幅度过大。
可分离卷积的引入
高通的研究人员深入研究了 MobileNetV1 的架构,发现深度卷积层是量化效果差的罪魁祸首。他们提出了可分离卷积,这是一种分解卷积操作的技术,将其拆分为深度卷积和逐点卷积。
深度卷积和逐点卷积
深度卷积沿输入特征图的深度方向进行卷积,而逐点卷积沿特征图的空间方向进行卷积。可分离卷积的优点在于,它使用更少的参数来执行与标准卷积相同的功能,从而提高了量化效率。
量化友好的可分离卷积
为了进一步增强量化性能,高通提出了量化友好的可分离卷积,引入了额外的超参数来控制量化过程。这些超参数允许对量化参数进行调整,从而实现更优的精度与效率之间的平衡。
应用与优势
量化友好的可分离卷积已被集成到 MobileNetV1 中,显著提高了其量化后的精度。此外,它还广泛应用于其他轻量级网络,例如 ShuffleNet 和 Xception。其优点包括:
- 提高量化精度
- 减少模型大小
- 降低推理成本
- 提高移动设备上的性能
实践指南
开发人员可以将量化友好的可分离卷积集成到自己的移动网络中,以提高其量化性能。以下是一些示例代码:
import tensorflow as tf
# 定义深度卷积层
depthwise_conv = tf.keras.layers.DepthwiseConv2D(
kernel_size=(3, 3),
strides=(1, 1),
padding="same"
)
# 定义逐点卷积层
pointwise_conv = tf.keras.layers.Conv2D(
filters=128,
kernel_size=(1, 1),
strides=(1, 1),
padding="same"
)
# 定义量化友好的可分离卷积层
quantized_separable_conv = tf.keras.layers.SeparableConv2D(
kernel_size=(3, 3),
strides=(1, 1),
padding="same",
use_bias=False,
depthwise_initializer=tf.keras.initializers.he_normal(),
pointwise_initializer=tf.keras.initializers.he_normal(),
depthwise_regularizer=tf.keras.regularizers.l2(0.0005),
pointwise_regularizer=tf.keras.regularizers.l2(0.0005)
)
结论
量化友好的可分离卷积是推动 MobileNets 在移动设备上发展的一项重要技术。它解决了 MobileNetV1 量化效果差的问题,显著提高了其精度和效率。开发人员可以通过将量化友好的可分离卷积集成到自己的移动网络中,充分利用其优势,在移动设备上部署高性能的深度神经网络。