距离上篇文章已有4个月,首先要对长期关注本公众号不离不弃的读者表示深深感谢!后面会开启周更模式,内容主要是 TensorFlow 实践和一些热门论文解读。如果有好的建议也欢迎各位童鞋不吝提出~
得益于智能手机的大量普及和移动处理器性能的逐年攀升,移动和嵌入式设备上的深度学习模型部署是今年一个新趋势。移动和嵌入式设备相比服务器的特点是需要考虑资源受限问题(计算能力、电池电量),模型计算量不能太大,而我们前面用到的 AlexNet、VGG、GoogLeNet、ResNet 等都是面向服务器设计的,运行在 CPU/GPU 上时问题不大,但在移动设备上部署则过于复杂,需要专门为这类应用设计更简单的模型。今天介绍的模型 MobileNets 【1】就是很好的例子。
MobileNets具有小规模、低延迟、低功耗的特点,为多种不同应用案例中的资源限制进行了参数化设计。和Inception这类主流的大型模型一样,这些模型同样可以用于分类、检测、嵌入、分割等任务。TensorFlow models 【2】包含了MobileNets的模型定义,它在TensorFlow上使用了TF-Slim以及其他16个用于完整移动项目的、在 ImageNet 分类数据集上预训练过的 checkpoint。通过TensorFlow Mobile,这些模型可以在脱机状态下在移动设备上高效运行。
上图中模型名称 MobileNet_v1_0_x_y 中 x, y 表示控制模型的宽度和输入分辨率的超参数 。
开发者可以根据预期的延迟和模型大小选择合适的MobileNet模型。模型在内存和磁盘上占用的空间与参数的数量成正比,计算耗时和功耗规模与乘积累加运算(MACs)的数字成正比。
我们知道,CNN 模型中计算量绝大部分集中在卷积层,因此降低卷积层计算量是必须首先解决的问题。
假设卷积层输入 feature map 尺寸为 。
MobileNets 使用了 可分离的深度方向卷积 替代经典卷积算法。其原理是将经典卷积层计算过程分解为两个卷积过程:深度方向卷积+点卷积。
左边:经典卷积算法;右边:深度方向卷积+点卷积。
(1) 深度方向卷积的卷积核尺寸为 。
(2) 点卷积卷积核尺寸为 1x1 x M x N,实现对上一步 M 个通道 feature map 合并、转换为 N 个通道新 feature map 过程。这一步计算量为 。
使用可分离的深度方向卷积 相比传统卷积算法,计算量之比为
MobileNet 整体架构如下:
上表中 Conv 表明为经典卷积层,Conv dw 表示深度方向卷积 ,s2 表示 stride = 2,s1 表示 stride = 1。
对模型进行统计:
可见计算量和参数数量大部分集中在 1x1 卷积部分。
TensorFlow 中的 conv2d 可以实现经典卷积算法,而 depthwise_conv2d 可以实现 深度方向卷积 ,separable_conv2d 则可实现 深度方向卷积+点卷积 ,如【3】所示:
-
conv2d
: Arbitrary filters that can mix channels together. -
depthwise_conv2d
: Filters that operate on each channel independently. -
separable_conv2d
: A depthwise spatial filter followed by a pointwise filter.
上图为 MobileNet 同其他模型对比的效果。MobileNet 在 ImageNet 数据集上的分类准确率和 VGG16 相差不大,但计算量、参数量降低约 30 倍;与 Sqeezenet 相比参数量差不多,但分类准确率高出 4%,同时计算量降低 22 倍!
由此可见,MobileNet 非常适合在移动设备、嵌入式设备上部署。
参考文献
【1】MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications, https://arxiv.org/abs/1704.04861
【2】https://github.com/tensorflow/models/blob/master/slim/nets/mobilenet\_v1.md
【3】https://www.tensorflow.org/api\_guides/python/nn#Convolution
如果你觉得本文对你有帮助,请关注公众号,将来会有更多更好的文章推送!