轻量级网络——EfficientNetV2

2023-11-22 14:40

本文主要是介绍轻量级网络——EfficientNetV2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1.EfficientNetV2介绍
  • 2.EfficientNetV2改进
    • 1)NAS Search
    • 2)EfficientNetV2 Architecture
    • 3)EfficientNetV2 Scaling
    • 4)Progressive Learning
  • 3.EfficientNetV2性能指标

paper链接:EfficientNetV2: Smaller Models and Faster Training
官方代码:https://github.com/google/automl/tree/master/efficientnetv2

paper核心:针对EfficientNets的不足提出了Fused-MBConv结构,应用训练感知NAS和缩放联合优化模型精度、训练速度和参数大小,还提出渐进性学习方法加快了训练时间。

ps:这篇笔记的图片来源与参考资料


1.EfficientNetV2介绍

EfficientNetV1的不足:

  • 使用非常大的图像尺寸进行训练是缓慢的。并且容易导致Out Of Memery
    在这里插入图片描述

  • depthwise convolutions在早期层是缓慢的。DW卷积比常规卷积具有更少的参数和失败,但它们往往不能充分利用现代加速器。Fused-MBConv与MBConv的部分结合效果比较好。(如下图所示,1-3层用Fused-MBConv而其他层用MBConv效果最好)
    在这里插入图片描述
    两者的结构图:
    在这里插入图片描述

  • 同等地扩大每个阶段是次优的。EfficientNetV2将使用非统一的缩放策略,逐步添加更多的层到后面的阶段。并稍微修改了缩放规则,将图像的最大尺寸限制为较小的值。

EfficientNetV2的贡献:

  • 提出EfficientNetV2,一个更小更快的新系列。通过我们的训练感知NAS和缩放发现,EfficientNetV2在训练速度和参数效率方面都优于以前的模型。
  • 提出一种改进的渐进式学习方法,它可以自适应地调整正则化与图像大小。试验表明,它加快了训练,同时提高了准确性。
  • 在ImageNet、CIFAR、Cars和Flowers数据集上演示了比现有技术快11倍的训练速度和6.8倍的参数效率。

EfficientNetV2的主要工作:

  • 主要关注训练速度与参数量
  • 对于小尺寸的图片采用小强度的正则化;对于大尺寸的图片采用高强度的正则化,提高了准确率,从而实现自适应正则化操作
  • 使用NAS搜索技术优化训练速度与参数效率

2.EfficientNetV2改进

1)NAS Search

这里采用的是trainning-aware NAS framework,搜索工作主要还是基于之前的Mnasnet以及EfficientNet. 但是这次的优化目标联合了accuracy、parameter efficiency以及trainning efficiency三个维度。这里是以EfficientNet作为backbone,设计空间包含:

  • convolutional operation type :{MBConv, Fused-MBConv}
  • number of layer
  • kernel size :{3x3, 5x5}
  • expansion ratio (MBConv中第一个expand conv1x1或者Fused-MBConv中第一个expand conv3x3): {1, 4, 6}

另外,作者通过以下方法来减小搜索空间的范围:

  • 删除不必要的搜索选项,如pooling skip操作,因为它们从来没有在最初的EfficientNets中使用
  • 重用EfficientNet中搜索的channel sizes

借助强化学习的思想,接着在搜索空间中随机采样了1000个模型,并针对每个模型训练10个epochs(使用较小的图像尺度)。搜索奖励结合了模型准确率A,标准训练一个step所需时间S以及模型参数大小P,奖励函数可写成: A ⋅ S w ⋅ P v A·S^{w}·P^{v} ASwPv,其中,w = − 0.07与v = − 0.05 (经验所得)

2)EfficientNetV2 Architecture

与EfficientNetV1类似,但是有几点不同:(注意是EfficientNetV2-S的结构)
在这里插入图片描述

  • 第一个不同点在于EfficientNetV2中除了使用到MBConv模块外,还使用了Fused-MBConv模块(主要是在网络浅层中使用)。
  • 第二个不同点是EfficientNetV2会使用较小的expansion ratio(MBConv中第一个expand conv1x1或者Fused-MBConv中第一个expand conv3x3)比如4,在EfficientNetV1中基本都是6. 这样的好处是能够减少内存访问开销。
  • 第三个不同点是EfficientNetV2中更偏向使用更小(3x3)的kernel_size,在EfficientNetV1中使用了很多5x5的kernel_size。通过下表可以看到使用的kernel_size全是3x3的,由于3x3的感受野是要比5x5小的,所以需要堆叠更多的层结构以增加感受野。
  • 最后一个不同点是移除了EfficientNetV1中最后一个步距为1的stage(就是EfficientNetV1中的stage8),可能是因为它的参数数量过多并且内存访问开销过大(由于网络是通过NAS搜索出来的,所有这里也是作者的猜测)。

通过上表可以看到EfficientNetV2-S分为Stage0到Stage7(EfficientNetV1中是Stage1到Stage9)。Operator表示在当前Stage中使用的模块:

  • Conv3x3就是普通的3x3卷积 + 激活函数(SiLU)+ BN
  • Fused-MBConv模块名称后跟的1,4表示expansion ratio,k3x3表示kenel_size为3x3,注意当expansion ratio等于1时是没有expand conv的,还有这里是没有使用到SE结构的(原论文图中有SE)。注意当stride=1且输入输出Channels相等时才有shortcut连接。还需要注意的是,当有shortcut连接时才有Dropout层,而且这里的Dropout层是Stochastic Depth,即会随机丢掉整个block的主分支(只剩捷径分支,相当于直接跳过了这个block)也可以理解为减少了网络的深度。具体可参考Deep Networks with Stochastic Depth这篇文章。
    在这里插入图片描述
  • MBConv模块和EfficientNetV1中是一样的,其中模块名称后跟的4,6表示expansion ratio,SE0.25表示使用了SE模块,0.25表示SE模块中第一个全连接层的节点个数是输入该MBConv模块特征矩阵channels的 1 4 \frac{1}{4} 41.注意当stride=1且输入输出Channels相等时才有shortcut连接。同样这里的Dropout层是Stochastic Depth
    在这里插入图片描述
    Stride就是步距,注意每个Stage中会重复堆叠Operator模块多次,只有第一个Opertator模块的步距是按照表格中Stride来设置的,其他的默认都是1。 #Channels表示该Stage输出的特征矩阵的Channels,#Layers表示该Stage重复堆叠Operator的次数。

3)EfficientNetV2 Scaling

使用复合缩放来扩展EfficientNetV2-S以获得EfficientNetV2-M/L并进行了一些额外的优化:

  • 将最大的推理图像大小限制为480,因为非常大的图像通常会导致昂贵的内存和训练速度开销
  • 逐渐添加更多的层到后面的阶段(如表4中的阶段5和阶段6),以增加网络容量但又不增加太多的运行开销

4)Progressive Learning

对于同一个网络,较小的图像尺寸也会导致较小的网络容量,因此需要较弱的正则化;反之,图像尺寸越大,计算量越大,容量越大,因此更容易出现过拟合。

当图像大小很小时,它在弱增强时具有最好的准确性;但对于更大的图像,增强效果更好。这种洞察力促使我们在训练过程中随着图像大小自适应地调整正则化,从而产生了我们改进的渐进学习方法。
在这里插入图片描述
渐进学习的训练过程:

在早期的训练时代,我们用较小的图像和较弱的正则化来训练网络,这样网络可以轻松快速地学习简单的表示。然后,我们逐渐增加图像的大小,但也使学习更加困难,增加更强的正则化。这里所说的regularization包括dropout rate,RandAugment magnitude以及mixup ratio(包括了数据增强)。如图所示:
在这里插入图片描述
作者将渐进式学习策略抽象成了一个公式来设置不同训练阶段使用的训练尺寸以及正则化强度。假设整个训练过程有N步,目标训练尺寸(最终训练尺度)是 S e S_{e} Se,正则化列表(最终正则强度) ϕ e = { ϕ e k } \phi_{e} = \{ \phi_{e}^{k} \} ϕe={ϕek}其中k代表k种正则方法(为了简单起见,作者这里用了3种:有Dropout、RandAugment以及Mixup)。初始化训练尺寸 S 0 S_{0} S0,初始化正则化强度为 ϕ 0 = { ϕ 0 k } \phi_{0} = \{\phi_{0}^{k}\} ϕ0={ϕ0k}。接着将整个训练过程划分成M个阶段,对于第i个阶段(1 ≤ i ≤ M)模型的训练尺寸为 S i S_{i} Si,正则化强度为 ϕ i = { ϕ i k } \phi_{i} = \{\phi_{i}^{k}\} ϕi={ϕik}。对于不同阶段直接使用线性插值的方法递增。具体流程如下:
在这里插入图片描述
下表给出了EfficientNetV2(S,M,L)三个模型的渐进学习策略参数:
在这里插入图片描述
对于渐进式学习,我们将训练过程分为四个阶段,每个阶段约87个epoch:早期阶段使用较小的图像尺寸,弱正则化,而后期阶段使用较大的图像尺寸,强正则化,如算法1所述。表6显示了图像大小和正则化的最小值(第一阶段)和最大值(最后阶段)。为简单起见,所有模型都使用相同的最小值大小和正则化,但它们采用不同的最大值,因为更大的模型通常需要更多的正则化来对抗过拟合。其中用于训练的最大图像大小大约比推理小20%,但我们在训练后不会对任何图层进行微调。

3.EfficientNetV2性能指标

ImageNet21k (Russakovsky et al., 2015)包含约13M训练图像,21,841个类。原始的ImageNet21k没有train/eval分割,所以作者保留随机抽取的100,000张图像作为验证集,其余的作为训练集。在很大程度上重复使用了与ImageNet ILSVRC2012相同的训练设置,但有一些变化:

  • 将训练时点改为60或30以减少训练时间,并使用余弦学习率衰减,可以适应不同的步骤,而无需额外的调整;
  • 由于每个图像有多个标签,作者将这些标签归一化,使之和为1,然后计算softmax loss。在ImageNet21k上进行预训练后,每个模型在ILSVRC2012上使用余弦学习速率衰减对15个时点进行微调。

表7显示了性能比较,其中标记为21k的模型在ImageNet21k上进行预训练,并在ImageNet ILSVRC2012上进行微调。与最近的ViT-L/16(21k)相比,EfficientNetV2L(21k)将top1准确率提高了1.5% (85.3% vs. 86.8%),使用的参数减少了2.5倍,FLOPs减少了3.6倍,同时在训练和推理方面提高了6 - 7倍。
在这里插入图片描述
EfficientNetV2的参数效率略好一些,但是用于推理的运行速度要快3倍
在这里插入图片描述

参考资料:
https://blog.csdn.net/qq_37541097/article/details/116933569
https://arxiv.org/abs/2104.00298

这篇关于轻量级网络——EfficientNetV2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/410852

相关文章

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor