efficientNet的原理及实现

EfficientNet是一种标准化模型扩展方法,通过平衡分辨率、深度和宽度,实现卷积神经网络在准确率和效率上的优化。本博客详细介绍EfficientNet的设计理念、复合扩展方法及基于EfficientNet的迁移学习实践。

  Model Scaling(模型扩展)一直以来都是提高卷积神经网络效果的重要方法。比如说ResNet可以增加层数从ResNet18扩展到ResNet200,GPipe通过对基线网络的四倍扩展在ImageNet上可以达到84.3%的准确率。本节要介绍的最新网络结构——EfficientNet,就是一种标准化模型扩展的结果。通过下面这张图,我们可以直观的感受一下EfficientNet B0-B7在ImageNet上的效果:对于ImageNet历史上各种网络,EfficientNet可以算是在效果上实现了碾压。

     因为效果太好,kaggle上的一众视觉比赛都开始在用。

什么是EfficientNet?

     一般我们可以通过调整输入图像大小、网络深度和宽度(即卷积通道数)来实现对卷积网络的扩展。在EfficientNet之前,很多的研究工作都只是针对这三个维度中某一个维度进行调整尝试,限于计算资源和人工调参等因素,很少有研究对这三个维度进行综合调整的。

     所以EfficientNet的设想就是能否设计一个标准化的卷积网络扩展方法,既可以实现较高的准确率,也可以充分节省算力资源。因而问题可以描述成如何平衡分辨率、深度和宽度这三个维度,实现卷积网络在准确率和效率上的优化。

     EfficientNet给出的解决方案是提出一种模型复合缩放方法(compound scaling method),如下图所示:

     图a是一个基线网络,图b、c和d这三个网络分别对该基线网络的宽度、深度和输入分辨率进行扩展,而图d网络就是EfficientNet的主要思想,综合宽度、深度和分辨率对网络进行复合扩展。

     一个卷积网络可以定义为如下式子:

     其中Fi表述对第i层的卷积运算,Li表述层Fi在第i个阶段被重复了Li次。<Hi,Wi,Ci>表示第i层输入的shape。EfficientNet的设想是一个卷积网络所有的卷积层必须通过相同的比例常数进行统一扩展,所以,一个模型扩展问题可以用数学语言描述为:

     其中d、w和r分别表示网络深度、宽度和分辨率。该式表示为在给定计算内存和效率的约束下,如何优化参数d、w和r来实现最好的模型准确率。

     EfficientNet的规范化复合调参方法使用了一个复合系数Φ对三个参数进行复合调整:

     其中α,β,γ作为常数可以由小型的网格搜索来确定,Φ为复合系数,用来控制模型的扩增。以上就是EfficientNet的复合扩展方式,但这仅仅是一种模型扩展方法,EfficientNet到底是什么样的一种Net我们还没有说到。换句话说,要实现state of the art的模型效果,光有扩展方式肯定不行,我们必须给这种方式提供一个比较好的基线网络。

     EfficientNet使用了MobileNet V2中的MBConv作为模型的主干网络,同时也使用了SENet中的squeeze and excitation方法对网络结构进行了优化。MBConv的主要结构如下图右所示,相较于MobileNet V1,MBConv的设计使得MobileNet V2能够更好利用残差连接带来的效果提升。具体细节可参考MobileNet V2论文。

     SENet的squeeze and excitation操作如下图所示,具体可参考SENet论文,这里不做详述。

     所以综合MBConv和squeeze and excitation方法的EfficientNet-B0的网络结构如下表所示:

     那么对于EfficientNet-B0这样一个baseline基线网络,如何使用复合扩展法对该网络进行扩展呢?这里主要分两步走。首先是将复合系数Φ固定为1,先假设有两倍以上的计算资源可用,然后对α,β,γ进行网络搜索。对于EfficientNet-B0网络,在约束条件为

时,α,β,γ分别取1.2、1.1和1.15时效果最佳。第二步则是固定α,β,γ,通过复合调整公式调整Φ对基线网络进行扩展得到B1至B7网络。于是就有了本文开头那张图,EfficientNet在ImageNet上的效果碾压过往各种经典网络。EfficientNet-B7在top1准确率上达到了84.4%,在top5准确率上达到了97.1%,同时模型规模要比此前的GPipe小了8.4倍:

 EfficientNet有8个系列,分别从b0-b7,,其中b0是baseline,b1-b7都是在b0基础上对深度、宽度和分辨率进行调整。从官方源码上,可以得到以下参数。其中,参数分别是宽度的相关系数,深度的相关系数,输入图片的分辨率和dropout的比例。这些参数如何得到的呢,就是通过刚刚介绍的AutoML进行搜索出来的。

基于EfficientNet的迁移学习

     普通人来训练和扩展EfficientNet实在太昂贵,一个值得尝试的方法就是迁移学习。下面使用EfficientNet-B0进行猫狗分类的迁移学习训练。

     先下载基于keras的EfficientNet迁移学习库:

!git clone https://github.com/Tony607/efficientnet_keras_transfer_learning%cd efficientnet_keras_transfer_learning/

     导入相关模块:

from efficientnet import EfficientNetB0 as Netfrom efficientnet import center_crop_and_resize, preprocess_input# loading pretrained conv base modelconv_base = Net(weights='imagenet', include_top=False, input_shape=input_shape)

     搭建基于EfficientNet-B0的迁移学习网络:

from tensorflow.keras import modelsfrom tensorflow.keras import layersdropout_rate = 0.2model = models.Sequential()model.add(conv_base)model.add(layers.GlobalMaxPooling2D(name='gap'))# model.add(layers.Flatten(name='flatten'))if dropout_rate > 0: model.add(layers.Dropout(dropout_rate, name='dropout_out'))# model.add(layers.Dense(256, activation='relu', name='fc1'))model.add(layers.Dense(2, activation='softmax', name='fc_out'))

     冻结卷积层不参与训练:

conv_base.trainable = False

     下载猫狗数据:

!wget https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_3367a.zip!unzip -qq kagglecatsanddogs_3367a.zip -d dog_vs_cat

     使用keras的ImageDataGenerator模块加载数据并训练:

from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(    rescale=1.0 / 255,    rotation_range=40,    width_shift_range=0.2,    height_shift_range=0.2,    shear_range=0.2,    zoom_range=0.2,    horizontal_flip=True,    fill_mode='nearest',)
# Note that the validation data should not be augmented!test_datagen = ImageDataGenerator(rescale=1.0 / 255)train_generator = train_datagen.flow_from_directory(    # This is the target directory    train_dir,    # All images will be resized to target height and width.    target_size=(height, width),    batch_size=batch_size,    # Since we use categorical_crossentropy loss, we need categorical labels    class_mode='categorical',)
validation_generator = test_datagen.flow_from_directory(    validation_dir,    target_size=(height, width),    batch_size=batch_size,    class_mode='categorical',)
model.compile(    loss='categorical_crossentropy',    optimizer=optimizers.RMSprop(lr=2e-5),    metrics=['acc'],)
history = model.fit_generator(    train_generator,    steps_per_epoch=NUM_TRAIN // batch_size,    epochs=epochs,    validation_data=validation_generator,    validation_steps=NUM_TEST // batch_size,    verbose=1,    use_multiprocessing=True,    workers=4,)

     20个epoch之后验证集准确率达到0.82。训练集和验证集损失以及准确率:

     有学术和技术问题的同学可以加我微信进入机器学习实验室读者交流群。加微信后说明来意,最好做个简单的自我介绍,让我有个印象。

 

参考资料:

Tan M, Le Q V. EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks[J]. arXiv preprint arXiv:1905.11946, 2019.

Sandler M, Howard A, Zhu M, et al. Mobilenetv2: Inverted residuals and linear bottlenecks[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 4510-4520.

Hu J, Shen L, Sun G. Squeeze-and-excitation networks[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2018: 7132-7141.

https://github.com/Tony607/efficientnet_keras_transfer_learning

github paper

链接:https://www.lijl888.com/archives/720

<think>好的,我现在要回答用户关于EfficientNet的工作原理及其优缺点的问题。首先,我需要回忆一下EfficientNet的基本信息。EfficientNet是由Google提出的卷积神经网络架构,它通过复合缩放方法在模型大小、计算成本准确率之间取得平衡。我需要详细解释其工作原理,包括深度可分离卷积、复合缩放策略,以及如何优化模型效率。 接下来是优点部分。EfficientNet的主要优势应该包括高效的计算资源利用、参数量少、推理速度快,以及在保持高准确率的同时实现轻量化。这些点需要具体说明,比如使用深度可分离卷积减少计算量,复合缩放如何平衡不同维度的扩展。 然后是缺点。可能的缺点有模型结构相对复杂,训练难度较高,对数据增强正则化依赖较大,以及在某些特定任务或小数据集上可能不如其他模型表现好。需要确认这些是否准确,是否有其他需要注意的点。 还要确保回答结构清晰,分点明确。可能需要检查是否有遗漏的关键点,例如是否提到MBConv块或者Squeeze-and-Excitation模块,这些是否属于EfficientNet的组成部分? 另外,用户要求最后给出相关问题,需要生成3-5个相关的问题,比如关于复合缩放的具体方法、与其他模型的比较、实际应用案例等。要确保这些问题与主题紧密相关,并且能够引导进一步的探讨。 需要避免错误的信息,例如混淆EfficientNet与其他模型(如MobileNet)的区别。确认复合缩放是EfficientNet的核心创新点,而不仅仅是简单地调整网络深度、宽度或分辨率中的某一个。最后,检查格式是否符合要求,没有使用Markdown,回答用中文,相关问题部分正确放在末尾,且没有换行错误。确保语言简洁明了,技术术语解释到位,适合不同层次的读者理解。</think>EfficientNet是一种高效的卷积神经网络架构,通过**复合缩放**(Compound Scaling)方法在模型大小、计算成本准确率之间取得平衡。其核心思想是: ### 工作原理 1. **深度可分离卷积**(Depthwise Separable Convolution) 替代传统卷积,将空间卷积通道卷积分离,大幅减少计算量参数量。例如,传统卷积的计算量为 $D_k \times D_k \times M \times N \times D_F \times D_F$,而深度可分离卷积仅为 $D_k \times D_k \times M \times D_F \times D_F + M \times N \times D_F \times D_F$(其中 $D_k$ 为卷积核尺寸,$M$ 为输入通道数,$N$ 为输出通道数,$D_F$ 为特征图尺寸)。 2. **MBConv块**(Mobile Inverted Bottleneck Convolution) 包含扩展层(Expansion)、深度卷积(Depthwise Conv)投影层(Projection),通过线性瓶颈结构减少冗余计算。例如,先用1×1卷积扩展通道,再用3×3深度卷积提取特征,最后用1×1卷积压缩通道。 3. **Squeeze-and-Excitation**(SE)模块 在MBConv中引入注意力机制,通过全局平均池化压缩特征,再通过全连接层生成权重,动态调整通道重要性。 4. **复合缩放**(Compound Scaling) 提出统一的缩放公式: $$ \text{depth} = \alpha^\phi, \quad \text{width} = \beta^\phi, \quad \text{resolution} = \gamma^\phi $$ 其中 $\alpha, \beta, \gamma$ 由网格搜索确定,$\phi$ 控制模型总规模(如B0-B7不同版本)。例如,B0为基准模型,B7将深度、宽度、分辨率分别扩展至2.1倍、2.4倍、1.8倍。 ### 优点 1. **高效性** 相比ResNet-152,在ImageNet上达到类似准确率时,EfficientNet-B4的参数量减少8.4倍,计算量降低16.7倍。 2. **轻量化** B0版本仅5.3M参数,适合移动端部署。 3. **可扩展性** 复合缩放策略使模型能灵活适配不同硬件资源需求。 ### 缺点 1. **训练复杂度高** 需要大量数据增强(如RandAugment)正则化(如Dropout、Label Smoothing)才能发挥性能。 2. **小数据集表现受限** 在CIFAR-10等小数据集上,可能因结构复杂导致过拟合。 3. **推理延迟敏感** 虽然FLOPs低,但移动端实际推理速度受内存访问效率影响较大。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值