当前位置: 代码迷 >> 综合 >> EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks
  详细解决方案

EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks

热度:20   发布时间:2023-11-23 04:34:37.0

论文链接:https://arxiv.org/pdf/1905.11946.pdf

一、文章简介:

在这篇论文中,作者研究了核心问题:是否有一种原则性的方法来扩大卷积神经网络,从而实现更好的准确性和效率?实证研究表明,平衡网络宽度/深度/分辨率的所有维度是至关重要的,这种平衡可以通过简单地将每个维度以恒定的比例缩放来实现。基于此,作者提出了一种简单有效的复合标度方法。与传统做法中任意缩放这些因素不同,本方法统一缩放网络宽度和深度和一组固定比例系数的分辨率。例如,如果想使用 2 N 2 ^N 2N倍的计算资源,那么可以简单将网络深度增加 α N , α^N, αN,宽度 β N β^N βN,和图像大小 γ N γ^N γN,α,β,γ是由小网格搜索原始的小模型的系数。下图标度方法和传统方法的区别
在这里插入图片描述
直观地说,复合缩放方法是有意义的,因为如果输入图像更大,那么网络需要更多的层来增加接收域,需要更多的通道来在更大的图像上捕捉更多的细粒度模式。

二、实现细节

(一)、Problem Formulation

一个ConvNet Layer" i i i"可以定义为一个函数: Y i = F i ( X i ) Y_i =F_i(X_i) Yi?=Fi?(Xi?), F i F_i Fi?是一个节点, Y i Y_i Yi?是输出张量, X i X_i Xi?是输入张量,张量的 shape 为 ( H i , W i , C i ) (H_i, W_i, C_i) Hi?,Wi?,Ci?)其中 H i , W i H_i, W_i Hi?,Wi?为空间维, C i C_i Ci?为通道维。一个ConvNet "N"可以用一个由层组成的列表来表示:
在这里插入图片描述
ConvNet通常划分为多个阶段,每个阶段的所有层都有相同的结构,例如ResNet有五个阶段,每一阶段的所有层除了第一层进行下采样外都具有相同的卷积类型。因此,可以将ConvNet定义为:
在这里插入图片描述
F i L i F_i^{L_i} FiLi??表示层 F i F_i Fi?在阶段 i i i中重复 L i L_i Li?次, ( H i , W i , C i (H_i, W_i,C_i (Hi?,Wi?Ci?表示层 i i i的输入张量X的shape。下图展示了一个典型的卷积网络,其中空间维数逐渐缩小,但通道维数逐层扩展,例如,从初始输入形状(224, 224, 3)到最终输出形状(7, 7, 512)。
在这里插入图片描述

与常规的ConvNet设计主要关注于寻找最佳的层架构 F i F_i Fi?不同,模型缩放试图扩大网络长度( L i L_i Li?)、宽度( C i C_i Ci?)和/或分辨率 ( H i , W i ) (H_i, W_i) (Hi?,Wi?),而不改变baseline network中预定义的 F i F_i Fi?。通过固定 F i F_i Fi?,模型缩放简化了资源约束下的设计问题,但在探索不同的 L i 、 C i 、 H i 、 W i L_i、C_i、H_i、W_i Li?Ci?Hi?Wi?对每个层的影响方面仍有很大的设计空间。为了进一步减少设计空间,限制所有的层必须以恒定的比例均匀缩放。来最大化给定资源约束下的模型精度,这可以被表述为一个优化问题:
在这里插入图片描述
其中 ⊙ ⊙ 表示连乘运算, w 、 d 、 r w、d、r wdr为缩放网络宽度、深度和分辨率的系数; F i 、 L i 、 H i 、 W i 、 C i F_i、L_i、H_i、W_i、C_i Fi?Li?Hi?Wi?Ci?是baseline network中预定义的参数(如下):
在这里插入图片描述

(二)、Problem Formulation

Depth (d):
缩放网络深度是许多卷积网络最常用的方法。更深层的ConvNet可以捕捉到更丰富、更复杂的特性,并且在新的任务中很好地推广。然而,由于消失梯度问题,更深层次的网络也更难训练。尽管有残差连接和批处理标准化缓解了训练问题,但极深网络的精度增益减小:例如ResNet-1000虽然有更多的层数,但精度与ResNet-101相似。如下显示了具有不同深度系数d的baseline network进行缩放的实证研究,进一步表明非常深的卷积神经网络的精度回报在递减:
在这里插入图片描述
Width (w):
缩放网络宽度通常用于小尺寸模型,正如在(Zagoruyko & Komodakis, 2016)中所讨论的,更广泛的网络往往能够捕捉更细粒度的特征,也更容易训练。然而,极宽但较浅的网络往往难以捕捉更高层次的特征。如下,当网络变得更宽、w更大时,精度迅速饱和。
在这里插入图片描述
Resolution(r):
通过更高分辨率的输入图像,ConvNets可以捕获更多的细粒度模式。从早期的224x224开始,现代卷积神经网络倾向于使用299x299 或331x331 来获得更好的精度。480 × 480、600x600,也被广泛应用于目标检测卷积网络。如下显示了缩放网络分辨率的结果,更高的分辨率确实提高了精度,但在非常高的分辨率下,精度增益减小(r = 1.0表示分辨率224x224, r = 2.5表示分辨率560x560)。
在这里插入图片描述
综上,扩大网络宽度、深度或分辨率的任何维度都能提高精度,但对于更大的模型,精度增益会减小。

(三)、Compound Scaling

不同的标度维度不是独立的。对于更高分辨率的图像,应该增加网络深度,这样更大的接收域可以帮助捕捉类似的特征,在更大的图像中包含更多的像素。相应地,当分辨率较高时,也应增加网络宽度以便在高分辨率的图像中捕捉更多的细粒度模式和更多的像素。这些直觉表明,我们需要协调和平衡不同的标度维度,而不是传统的单维度标度。
作者比较了不同网络深度和分辨率下的宽度变化,如下所示。如果只缩放网络宽度w,而不改变深度(d=1.0)和分辨率(r=1.0),那么精度很快就会饱和。对于更深的(d=2.0)和更高的分辨率(r=2.0),宽度缩放可以在相同的FLOPS成本下获得更好的精度。
在这里插入图片描述
因此,为了追求更好的精度和效率,在ConvNet缩放过程中,平衡网络宽度、深度和分辨率的各个维度是至关重要的。本文提出了一种新的复合标度方法,利用复合系数φ对网络的宽度、深度和分辨率进行了有原则的均匀标度:
在这里插入图片描述
其中, α , β , γ α, β, γ αβγ是常数,可以由一个小网格搜索确定。,φ是一个指定的系数,它控制有多少资源可以用于模型缩放,而 α , β , γ α, β, γ αβγ指定如何分配这些额外的资源,分别为网络宽度,深度和分辨率。值得注意的是,一个常规的卷积运算的FLOPS与 d , w 2 , r 2 d, w^2, r^2 d,w2,r2成正比,也就是说,加倍网络深度会使FLOPS增加一倍,但是加倍网络宽度或分辨率会使FLOPS增加四倍。由于卷积运算通常占据卷积网络的计算成本,用上式缩放卷积网络将大约增加 ( α , β 2 , γ 2 ) φ (α, β^2, γ^2)^φ αβ2γ2φ的FLOPS。本文约束了 α ? β 2 ? γ 2 ≈ 2 α · β^2· γ^2 ≈ 2 α?β2?γ22,对于任何新的φ,总FLOPS将大约增加 2 φ 2^φ 2φ.

(四)、EfficientNet Architecture

在这里插入图片描述
上表表为EfficientNet-B0的网络框架(B1-B7就是在B0的基础上调整Resolution,Channels以及Layers),网络总共分成了9个Stage,第一个Stage是一个卷积核大小为3x3步长为2的普通卷积层(包含BN和激活函数Swish),Stage2~Stage8都是在重复堆叠MBConv结构(最后一列的Layers表示该Stage重复MBConv结构多少次),而Stage9由一个普通的1x1的卷积层(包含BN和激活函数Swish)一个平均池化层和一个全连接层组成。表格中每个MBConv后会跟一个数字1或6,这里的1或6就是倍率因子n即MBConv中第一个1x1的卷积层会将输入特征矩阵的channels扩充为n倍,其中k3x3或k5x5表示MBConv中Depthwise Conv所采用的卷积核大小。Channels表示通过该Stage后输出特征矩阵的Channels。
在这里插入图片描述
MBConv结构主要由一个1x1的普通卷积(包含BN和Swish)进行升维,一个kxk的Depthwise Conv卷积(包含BN和Swish)k的具体值可看EfficientNet-B0的网络框架主要有3x3和5x5两种情况,一个SE模块,一个1x1的普通卷积(降维作用,包含BN),一个Droupout层构成。
第一个升维的1x1卷积层,它的卷积核个数是输入特征矩阵channel的n倍,n ∈ { 1 , 6 };
当n = 1时,不要第一个升维的1x1卷积层,即Stage2中的MBConv结构都没有第一个升维的1x1卷积层;
shortcut连接,仅当输入MBConv结构的特征矩阵与输出的特征矩阵shape相同时才存在;
在这里插入图片描述
SE模块如上,由一个全局平均池化,两个全连接层组成。第一个全连接层的节点个数是输入该MBConv特征矩阵channels的1/4 ,且使用Swish激活函数。第二个全连接层的节点个数等于Depthwise Conv层输出的特征矩阵channels,且使用Sigmoid激活函数。
在这里插入图片描述
其余结构如上:
input_size代表训练网络时输入网络的图像大小;
width_coefficient代表channel维度上的倍率因子,比如在 EfficientNetB0中Stage1的3x3卷积层所使用的卷积核个数是32,那么在B6中就是32 × 1.8 = 57.6 32 \times 1.8=57.632×1.8=57.6接着取整到离它最近的8的整数倍即56,其它Stage同理;
depth_coefficient代表depth维度上的倍率因子(仅针对Stage2到Stage8),比如在EfficientNetB0中Stage7的 l i = 4 l_i=4 li?=4,那么在B6中就是4 × 2.6 = 10.4 接着向上取整即11.
drop_connect_rate是在MBConv结构中dropout层使用的drop_rate,在官方keras模块的实现中MBConv结构的drop_rate是从0递增到drop_connect_rate的(具体实现可以看下官方源码,注意,在源码实现中只有使用shortcut的时候才有Dropout层)。还需要注意的是,这里的Dropout层是Stochastic Depth,即会随机丢掉整个block的主分支(只剩捷径分支,相当于直接跳过了这个block)也可以理解为减少了网络的深度。
dropout_rate是最后一个全连接层前的dropout层(在stage9的Pooling与FC之间)的dropout_rate。
文章部分内容出自:https://blog.csdn.net/qq_37541097/article/details/114434046

  相关解决方案