EfficientNet论文解读

论文: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所示:

EfficientNet论文解读
图1. 左图是单独调节网络宽度width(即channels), 中间图是单独调节网络深度depth, 右图是单独调节网络的分辨率。

可以看到,单独调节这些量,最终在精度达到80%时,模型的精度提升很缓慢了,几乎是进入饱和了。或者按照原文所说的,调节这些量则对于大的网络,精度的增益减少了。

那如果不是单独调节这些量,而是做多维度的scaling,也即同时调节这些量会是什么效果呢?作者就给出了如下图2所示的手动调节这些量的效果:

EfficientNet论文解读
图2.手动调节网络的宽度(w),深度(d)和分辨率(r)后的结果。
不同颜色的线条代表不同的模型,同一线条上不同的点代表不同的网络宽度(w).

       可以看到,同时调节网络的宽度,深度和输入图像分辨率可以使模型性能更优,可以突破单一参数变化时的模型精度,说明多维度的scaling是很有效的。那么该怎样去用一种自动的方法来找到这三个参数的最佳组合,使得网络最优化呢?这就是本文所要解决的一个问题。

2.论文解决方案 (compound scaling method)

       对于卷积神经网络的某一层 EfficientNet论文解读EfficientNet论文解读, 其中 EfficientNet论文解读 是输入到第 EfficientNet论文解读 层的张量,其大小为EfficientNet论文解读,这里为简便起见,忽略batch size;EfficientNet论文解读 表示一个卷积操作,EfficientNet论文解读 表示第 EfficientNet论文解读 层的输出张量。对于一个完整的卷积网络EfficientNet论文解读(共k层),其可以用数学公式表达为:

EfficientNet论文解读

事实上,很多卷积层可以被分配到不同的stage中,在每个stage中,这些卷积层有着相同的结构。因此一个卷积网络又可以被写成为如下形式:

EfficientNet论文解读

EfficientNet论文解读 表示在stage  EfficientNet论文解读 (注意不是第 EfficientNet论文解读 层卷积), 基础网络层EfficientNet论文解读 层被重复了 EfficientNet论文解读 次。那么本文所要做的就是通过多维度scaling, 也即同时调节网络的宽度(w), 深度(d)和分辨率(r) 来最优化网络精度,即:

EfficientNet论文解读

因此,这篇文章所要做的就是找到合适的d, w 和 r, 使得网络的精度最优。那么该怎么找到d, w和 r 呢?本文给出了如下方法:

定义复合系数 EfficientNet论文解读,以及三个参数(常数值)EfficientNet论文解读EfficientNet论文解读 和 EfficientNet论文解读,使得满足如下关系:

EfficientNet论文解读

        这里的 EfficientNet论文解读 根据需求由人工来选择的,可以选为1,2,3..., 本文一直选到8。而其它三个参数EfficientNet论文解读EfficientNet论文解读 和 EfficientNet论文解读是通过格点搜索法(grid search)获得的。也就是选定一组EfficientNet论文解读EfficientNet论文解读 和 EfficientNet论文解读参数值,训练一个网络,然后比较所有的这些网络的精度,挑选出精度最高的网络所对应的的这三个EfficientNet论文解读EfficientNet论文解读 和 EfficientNet论文解读的值。 不过这个需要有强大的硬件支持,Google有条件做,但普通公司很难去做这种事。

          在用格点搜索法时,作者将 EfficientNet论文解读 设为1,这样求得的 EfficientNet论文解读EfficientNet论文解读EfficientNet论文解读。这样得到的网络称为 EfficientNet-B0, 在求EfficientNet-B1 ~ EfficientNet-B7时,EfficientNet论文解读 取为2 ~8,而EfficientNet论文解读EfficientNet论文解读 和 EfficientNet论文解读一直设为EfficientNet论文解读 取1时的值。在本文中,作者使用的主干网络(backbone )为MobileNets 和 ResNets.

3.论文结果

       本文的这个方法的最大的好处是,在保证模型精度非常高的条件下,模型的参数量和计算量要比同级别精度的模型低好几倍。比如,EfficientNet-B7在ImageNet数据集上的top-1和top-5的精度分别为84.4%和97.1%, 是论文发表时的最高分数,但是它比现有的模型小8.4倍,模型推断时的速度比现有的模型快6.1倍。下表以及图3和图4展示了本文在ImageNet上的结果,其他更多的结果请参考原文。

EfficientNet论文解读

 

EfficientNet论文解读
图3

 

EfficientNet论文解读
图4

 


4.部分细节说明

(1)模型的深度d变为原来的2倍,则总的计算量也变为原来的2倍。模型的分辨率变r为原来的2倍,则总的计算量也变为原来的2倍。这是可以理解的。比如d为原来的2倍,说明stage也扩展为原来的两倍。r 为原来的2倍,说明输入图像的高和宽也都是为原来的2倍,这样计算量就是原来的4倍了。

         那么该如何理解网络宽度w为原来的2倍,计算量就是原来的4倍呢?这是因为输入输出通道都变成原来的2倍了,所以在计算量方面相当于4倍。具体可以这么理解:这里不以stage为例,只以单个卷积层为例。由于w为原来2倍,那么每一个卷积层的channel数都为原来的两倍,这样第EfficientNet论文解读层的channel为原来的两倍,那么卷积核的“channel”也得是原来的两倍,由于第EfficientNet论文解读层的channel为原来的2倍,那么第EfficientNet论文解读层所需的卷积核数目也得是原来的2倍,才能使得生成的第EfficientNet论文解读层卷积层的通道是原来的2倍。也就是4倍是来自于每个卷积核的通道增加为原来的2倍和每一个卷积层总的卷积核数目是原来的2倍,两者相乘就是4倍。

(2)模型的计算量的变化是由于d, w和 r的变化造成的,也即计算量正比于 EfficientNet论文解读 ,也即正比于EfficientNet论文解读,文中作者把

EfficientNet论文解读是为了使得EfficientNet论文解读取不同值时,模型的计算量的增加近似满足EfficientNet论文解读倍。我想应该也可以设置为3,4,5等等,不过这样计算量增加的太大了点。