深度学习-EfficientNet算法总结

1. 引言

EfficientNet是谷歌2019年的新论文。

文章:EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks (ICML 2019 )

论文链接:https://arxiv.org/abs/1905.11946
代码链接:https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet
第三方实现的PyTorch代码:https://github.com/lukemelas/EfficientNet-PyTorch

这篇论文主要讲述了如何利用复合系数统一缩放模型的所有维度,达到精度最高和效率最高。符合系数包括w,d,r,其中,w表示卷积核大小,决定了感受野大小;d表示神经网络的深度;r表示分辨率大小。

2. 算法笔记

2.1 摘要

卷积神经网络通常都是先在固定资源预算下开发设计,然后如果资源有多余的话再将模型结构放大以便获得更好的精度。在本篇论文中,我们系统地研究了模型缩放并且仔细验证了网络深度、宽度和分辨率之间的平衡可以导致更好的性能表现。基于这样的观察,我们提出了一种新的缩放方法——使用一个简单高效的复合系数来完成对深度/宽度/分辨率所有维度的统一缩放。我们在MobileNets和ResNet上展示了这种缩放方法的高效性。

为了进一步研究,我们使用神经架构搜索设计了一个baseline网络,并且将模型放大获得一系列模型,我们称之为EfficientNets,它的精度和效率比之前所有的卷积网络都好。尤其是我们的EfficientNet-B7在ImageNet上获得了最先进的 84.4%的top-1精度 和 97.1%的top-5精度,同时比之前最好的卷积网络大小缩小了8.4倍、速度提高了6.1倍。我们的EfficientNets也可以很好的迁移,并且实现了最先进的精度——CIFAR-100(91.7%)、Flowers(98.8%)、其他3个迁移学习数据集。

2.2 文章重点总结

  1. 目前通用的几种方法是放大CNN的深度、宽度和分辨率,在之前都是单独放大这三个维度中的一个,尽管任意放大两个或者三个维度也是可能的,但是任意缩放需要繁琐的人工调参同时可能产生的是一个次优的精度和效率。
  2. 在本篇论文中,我们想要研究和重新思考放大CNN的过程,尤其地,我们调查了一个中心问题:是否存在一个原则性的放大CNN的方法实现更好的精度和效率?我们的实验研究表明了平衡深度、宽度和分辨率这三个维度是至关重要的,令人惊讶的是这样的平衡可以通过简单的使用一组常量比率来缩放每一个维度,基于这个观察,我们提出了一个简单高效的复合缩放方法,不像传统实践中任意缩放这些因子,我们的方法使用一组固定的缩放系数统一缩放网络深度、宽度和分辨率。
  3. 在已经存在的MobileNets和ResNets上展示了我们的缩放方法可以工作得很好,值得注意的是,模型缩放的高效性严重地依赖于baseline网络,为了进一步研究,我们使用网络结构搜索发展了一种新的baseline网络,然后将它缩放来获得一系列模型,称之为EfficientNets。

2.3 个人总结

本人理解的笔记如下:

  1. 文中总结 了我们常用的三种网络调节方式:增大感受野w,增大网络深度d,增大分辨率大小r,三种方式示意图如下:
    深度学习-EfficientNet算法总结
    其中,(a)为基线网络,也可以理解为小网络;(b)为增大感受野的方式扩展网络;©为增大网络深度d的方式扩展网络;(d)为增大分辨率r的方式扩展网络;(e)为本文所提出的混合参数扩展方式。

  2. 文中试验测试,调查了w/r/d在各种情况下的准确率和效率的相互关系曲线,如下图所示:
    深度学习-EfficientNet算法总结
    个人总结规律如下:

2.1,在r和w大小不变的情况下,随着d的增大,准确率没有太大的差异;

2.2,在d和w不变的情况下,随着r的增大,准确率有较大提升;

2.3,r和d不变的情况下,随着w的增大,准确率先有较大提升,然后趋于平缓,往后在无太大提升;

  1. 复合系数的数学模型
    文中给出了一般卷积的数学模型如下:
    深度学习-EfficientNet算法总结

其中H,W为卷积核大小,C为通道数,X为输入tensor;

则复合系数的确定转为如下的优化问题:
深度学习-EfficientNet算法总结

调节d,w,r使得满足内存Memory和浮点数量都小于阈值要求;

为了达到这个目标,文中提出了如下的方法:

深度学习-EfficientNet算法总结

对于这个方法,我们可以通过一下两步来确定d,w,r参数:

深度学习-EfficientNet算法总结
第一步我们可以通过基线网络来调节确定最佳的,然后,用这个参数将基准网络扩展或放大到大的网络,这样就可以使大网络也具有较高的准确率和效率。同样,我们也可以将基线网络扩展到其他网络,使用同样的方法来放大;

论文中基线模型使用的是 mobile inverted bottleneck convolution(MBConv),类似于 MobileNetV2 和 MnasNet,但是由于 FLOP 预算增加,该模型较大。于是,研究人员缩放该基线模型,得到了EfficientNets模型,它的网络示意图如下:
深度学习-EfficientNet算法总结

最后,研究人员对EfficientNets的效率进行了测试,结果如下:

深度学习-EfficientNet算法总结

对比EfficientNets和已有的CNN模型,EfficientNet 模型要比已有 CNN 模型准确率更高、效率更高,其参数量和 FLOPS 都下降了一个数量级,EfficientNet-B7 在 ImageNet 上获得了当前最优的 84.4% top-1 / 97.1% top-5 准确率,而且CPU 推断速度是 Gpipe 的 6.1 倍,而且模型大小方面,EfficientNet-B7却比其他模型要小得多,同时,还对比了ResNet-50,准确率也是胜出一筹(ResNet-50 76.3%,EfficientNet-B4 82.6%)。

EffieicntNet的研究思路大家可以学习一下,在这个时代,创新性思维显得弥足珍贵,心平气和,好好研究论文吧~