EfficientNet论文解读
论文:EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks论文原作者给出的代码链接:https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet第三方实现的PyTorch代码:https://github.com...
论文:EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks
论文原作者给出的代码链接:https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet
第三方实现的PyTorch代码:https://github.com/lukemelas/EfficientNet-PyTorch
1. 论文动机
搭建神经网络时主观性其实是很强的,很多时候你是根本不知道应该搭建多少层,输入的图像高(H)和宽(W)应该是多少。所以一种通用的做法是使用文献中发表的网络结构。不过这篇文章不是讲你该怎么搭建网络结构,而是对于已有的网络,你该怎么优化它,使得它的参数和计算量最小化但是性能最优化。
通常要想使网络性能更优,一般是从如下三个角度去调节网络结构的:分辨率(或者说是输入图像尺寸)、每一个卷积层的channel数(也就是本文所说的width, 注意不要和图像的宽度搞混淆了)以及卷积层的数目(也就是网络的深度 depth)。作者展示了单一调节这三个量的效果,如下图1所示:
可以看到,单独调节这些量,最终在精度达到80%时,模型的精度提升很缓慢了,几乎是进入饱和了。或者按照原文所说的,调节这些量则对于大的网络,精度的增益减少了。
那如果不是单独调节这些量,而是做多维度的scaling,也即同时调节这些量会是什么效果呢?作者就给出了如下图2所示的手动调节这些量的效果:
可以看到,同时调节网络的宽度,深度和输入图像分辨率可以使模型性能更优,可以突破单一参数变化时的模型精度,说明多维度的scaling是很有效的。那么该怎样去用一种自动的方法来找到这三个参数的最佳组合,使得网络最优化呢?这就是本文所要解决的一个问题。
2.论文解决方案 (compound scaling method)
对于卷积神经网络的某一层 , , 其中 是输入到第 层的张量,其大小为,这里为简便起见,忽略batch size; 表示一个卷积操作, 表示第 层的输出张量。对于一个完整的卷积网络(共k层),其可以用数学公式表达为:
事实上,很多卷积层可以被分配到不同的stage中,在每个stage中,这些卷积层有着相同的结构。因此一个卷积网络又可以被写成为如下形式:
表示在stage (注意不是第 层卷积), 基础网络层 层被重复了 次。那么本文所要做的就是通过多维度scaling, 也即同时调节网络的宽度(w), 深度(d)和分辨率(r) 来最优化网络精度,即:
因此,这篇文章所要做的就是找到合适的d, w 和 r, 使得网络的精度最优。那么该怎么找到d, w和 r 呢?本文给出了如下方法:
定义复合系数 ,以及三个参数(常数值), 和 ,使得满足如下关系:
这里的 根据需求由人工来选择的,可以选为1,2,3..., 本文一直选到8。而其它三个参数, 和 是通过格点搜索法(grid search)获得的。也就是选定一组, 和 参数值,训练一个网络,然后比较所有的这些网络的精度,挑选出精度最高的网络所对应的的这三个, 和 的值。 不过这个需要有强大的硬件支持,Google有条件做,但普通公司很难去做这种事。
在用格点搜索法时,作者将 设为1,这样求得的 , , 。这样得到的网络称为 EfficientNet-B0, 在求EfficientNet-B1 ~ EfficientNet-B7时, 取为2 ~8,而, 和 一直设为 取1时的值。在本文中,作者使用的主干网络(backbone )为MobileNets 和 ResNets.
3.论文结果
本文的这个方法的最大的好处是,在保证模型精度非常高的条件下,模型的参数量和计算量要比同级别精度的模型低好几倍。比如,EfficientNet-B7在ImageNet数据集上的top-1和top-5的精度分别为84.4%和97.1%, 是论文发表时的最高分数,但是它比现有的模型小8.4倍,模型推断时的速度比现有的模型快6.1倍。下表以及图3和图4展示了本文在ImageNet上的结果,其他更多的结果请参考原文。
4.部分细节说明
(1)模型的深度d变为原来的2倍,则总的计算量也变为原来的2倍。模型的分辨率变r为原来的2倍,则总的计算量也变为原来的2倍。这是可以理解的。比如d为原来的2倍,说明stage也扩展为原来的两倍。r 为原来的2倍,说明输入图像的高和宽也都是为原来的2倍,这样计算量就是原来的4倍了。
那么该如何理解网络宽度w为原来的2倍,计算量就是原来的4倍呢?这是因为输入输出通道都变成原来的2倍了,所以在计算量方面相当于4倍。具体可以这么理解:这里不以stage为例,只以单个卷积层为例。由于w为原来2倍,那么每一个卷积层的channel数都为原来的两倍,这样第层的channel为原来的两倍,那么卷积核的“channel”也得是原来的两倍,由于第层的channel为原来的2倍,那么第层所需的卷积核数目也得是原来的2倍,才能使得生成的第层卷积层的通道是原来的2倍。也就是4倍是来自于每个卷积核的通道增加为原来的2倍和每一个卷积层总的卷积核数目是原来的2倍,两者相乘就是4倍。
(2)模型的计算量的变化是由于d, w和 r的变化造成的,也即计算量正比于 ,也即正比于,文中作者把
是为了使得取不同值时,模型的计算量的增加近似满足倍。我想应该也可以设置为3,4,5等等,不过这样计算量增加的太大了点。
(3) 可能大家有这样的困惑, 的值都是大于1的,那么相应的d, w, r都要比主干网络大,那么得到的EfficientNet应该要比主干网络大,那怎么能说更高效呢?我的理解是这样的:文中在得到EfficientNet-B0时,的确是比它的主干网络大,在论文的表1中,它用的主干网络是“mobile inverted bottleneck MBConv”, 但是我们和其他网络在对比性能的时候是按照模型的精度和FLOPS同时对比的,将模型精度差不多的几个网络和EfficientNet一起对比,而这几个网络很可能就不是这里的主干网络了。例如,从上表可以看出,EfficientNet-B0的精度比ResNet-50, DenseNet-169略微好一点,但是模型的参数和计算量却大大下降了,所以说是高效的。再比如EfficientNet-B3的精度比ResNeXt-101以及PolyNet略微好一点,但是模型参数和计算量也大大下降了。所以用哪一个EfficientNet和哪些其他模型对比主要是按照模型精度来划分的,就是为了说明,在精度差不多时,EfficientNet系列的模型参数量和计算量比其他模型大大下降了,体现了高效。
(4)在用格点搜索(grid search)法时, 作者并不是单单选精度最高的,而是要满足下面的公式来决定最终的这三个参数:
这里 代表模型, 代表target FLOPS, 是一个超参数,用来平衡精度和计算量(FLOPS)。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)