EfficientNet论文解读

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

摘要

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

1. Introduction

为了获得更好的精度,放大卷积神经网络是一种广泛的方法。举个例子,ResNet可以通过使用更多层从ResNet-18放大到ResNet-200;目前为止,GPipe通过将baseline模型放大四倍在ImageNet数据集上获得了84.3%的top-1精度,然而,放大CNN的过程从来没有很好的理解过,目前通用的几种方法是放大CNN的深度、宽度和分辨率,在之前都是单独放大这三个维度中的一个,尽管任意放大两个或者三个维度也是可能的,但是任意缩放需要繁琐的人工调参同时可能产生的是一个次优的精度和效率。

在本篇论文中,我们想要研究和重新思考放大CNN的过程,尤其地,我们调查了一个中心问题:是否存在一个原则性的放大CNN的方法实现更好的精度和效率?我们的实验研究表明了平衡深度、宽度和分辨率这三个维度是至关重要的,令人惊讶的是这样的平衡可以通过简单的使用一组常量比率来缩放每一个维度,基于这个观察,我们提出了一个简单高效的复合缩放方法,不像传统实践中任意缩放这些因子,我们的方法使用一组固定的缩放系数统一缩放网络深度、宽度和分辨率。举个例子,如果想使用 2 N 2^{N} 2N倍的计算资源,我们可以简单的对网络深度扩大 α N \alpha ^{N} αN倍、宽度扩大 β N \beta ^{N} βN、图像尺寸扩大 γ N \gamma ^{N} γN倍,这里的 α , β , γ \alpha ,\beta, \gamma α,β,γ都是由原来的小模型上做微小的网格搜索决定的常量系数,Figure 2展示了我们的缩放方法和传统方法之间的区别。
在这里插入图片描述
直观来讲,如果图像尺寸变大,复合的缩放方法会很有意义,因为当图像尺寸变大意味着网络需要更多层来增加接受野,同时需要更多的通道来捕捉更大图像上更多细粒度的模式信息。事实上,以前的理论(Raghu等,2017; Lu等,2018)和实证结果(Zagoruyko&Komodakis,2016)两者表明网络之间存在一定的关系宽度和深度,但据我们所知,我们是首先要凭经验量化三者之间的关系网络宽度,深度和分辨率的尺寸。

我们在已经存在的MobileNets和ResNets上展示了我们的缩放方法可以工作得很好,值得注意的是,模型缩放的高效性严重地依赖于baseline网络,为了进一步研究,我们使用网络结构搜索发展了一种新的baseline网络,然后将它缩放来获得一系列模型,称之为EfficientNets。Figure 1总结了ImageNet的表现,EfficientNets由于其他CNN网络,尤其地,我们的EfficientNet-B7超越了之前最好的GPipe的精度,但是参数量少了8.4倍、速度快了6.1倍。相比于广泛使用的ResNet-50,我们的EfficientNets-B4在相近的FLOPS下将top-1精度从76.3%提高到了82.6%。除了ImageNet,EfficientNets在其他数据集上表现也很好,在8个广泛应用的数据集中的5个实现了最先进的精度,然而比存在的卷积网络的参数量减少了21倍。
在这里插入图片描述

2. Related Work

ConvNet精度:自从AlexNet赢得2012的ImageNet竞赛,ConvNets随着变得更大获得了更高的精度,同时GoogleNet使用6.8M的参数获得了74.8%的top-1精度,SENet使145M参数获得了82.7%的top-1精度。最近,GPipe进一步提高了精度——使用了557M的参数获得了84.3%的top-1验证精度:它如此的大以至于需要将网络划分使用特定的并行化手段训练,然后将每一部分传递到一个不同的加速器。然而这些模型主要是为ImageNet设计,但是将其迁移到其他应用上时效果也很好。

ConvNet效率:深度网络的参数过多,模型压缩是一种通用的方法减小模型大小——平衡精度和效率。当移动网络变得无处不在时,我们也通常要手动设计高效的ConvNets,比如SqueezeNets、MobileNets、ShuffleNets。最近,神经网络结构搜索在设计高效的ConvNets变得越来越流行,并且通过广泛搜索网络宽度、深度、卷积核类型和大小得到了比手动设计的模型更高的精度。然而,目前还不清楚怎么将这些技术应用到更大的模型中,通常要更大的设计空间和更贵的微调成本,在本篇论文中,我们旨在研究效率设计更大规模的ConvNets,为了实现这个目标,我们采用模型缩放。

模型缩放:有很多的方法因不同的资源限制对ConvNet进行缩放:ResNet可以通过调整深度(缩小到ResNet-18,放大到ResNet-200),WideResNet和MobileNets可以通过对宽度(#channels)缩放。公认的是更大的输入图像尺寸有利于提高精度,同时需要更多的计算量。尽管之前的研究展示了网络深度和宽度对ConvNets的表现力很重要,它仍然是一个开放的问题来高效缩放ConvNet获得更好的效率和精度。我们的工作系统地研究了ConvNet对网络深度、宽度和分辨率这三个维度进行了缩放。

3. Compound Model Scaling

在本节中,我们将缩放问题公式化,研究了不同的方法并且提出了我们新的缩放方法。

3.1. Problem Formulation

卷积层 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表示输入张量, &lt; H i , W i , C i &gt; &lt;H_{i},W_{i},C_{i}&gt; <Hi,Wi,

### ResNet 论文详解与深度学习卷积神经网络架构解析 #### 1. 背景介绍 在深度学习领域,随着网络层数的增加,模型可能会面临梯度消失或梯度爆炸的问题。这些问题可能导致训练困难,甚至使模型性能下降。为了应对这些挑战,ResNet(残差网络)被提出作为一种有效的解决方案[^2]。 #### 2. 核心思想 ResNet 的核心在于引入了 **残差结构**(residual structure),允许网络通过跳跃连接(skip connections)直接传递输入信息到后续层。这种设计能够缓解深层网络中的退化问题(degradation problem),即当网络变得更深时,训练误差不再减小反而可能增大。通过这种方式,即使在网络非常深的情况下,模型仍然可以保持良好的收敛性和泛化能力。 #### 3. 数学表达 假设某一层的输入为 \( x \),目标是学习一个映射函数 \( H(x) \)。传统方法试图直接拟合 \( H(x) \),而 ResNet 则改为目标学习一个残差函数 \( F(x) = H(x) - x \)。因此,最终输出变为: \[ y = F(x) + x \] 其中 \( y \) 是该层的输出。这样的形式使得优化过程更加容易,因为即使 \( F(x) \) 接近零,模型也能轻松学到恒等映射 \( H(x) = x \)[^2]。 #### 4. 架构细节 ResNet 中的关键组件包括以下几个部分: - **残差块(Residual Block)** 每个残差块通常由两到三个卷积层构成,并辅以批量归一化(Batch Normalization, BN)和激活函数(ReLU)。如果输入和输出维度不匹配,则可以通过线性投影实现降维操作[^2]。 - **跳跃连接(Skip Connections)** 这些连接负责将前面的信息无损地传送到后面的层中,从而避免因过多非线性变换而导致的信息丢失。 以下是 PyTorch 实现的一个简单版本的 ResNet 块代码示例: ```python import torch.nn as nn class BasicBlock(nn.Module): expansion = 1 def __init__(self, in_channels, out_channels, stride=1, downsample=None): super(BasicBlock, self).__init__() self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(out_channels) self.relu = nn.ReLU(inplace=True) self.conv2 = nn.Conv2d(out_channels, out_channels * self.expansion, kernel_size=3, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(out_channels * self.expansion) self.downsample = downsample def forward(self, x): identity = x out = self.conv1(x) out = self.bn1(out) out = self.relu(out) out = self.conv2(out) out = self.bn2(out) if self.downsample is not None: identity = self.downsample(x) out += identity out = self.relu(out) return out ``` #### 5. 应用场景 ResNet 不仅适用于图像分类任务,在其他多种计算机视觉任务中也有广泛应用,例如目标检测、语义分割等领域。它的成功推动了许多后续工作的诞生,比如 DenseNet 和 EfficientNet 等新型架构的设计思路都受到启发[^2]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值