首页 > 其他分享 >EfficientNet V2网络

EfficientNet V2网络

时间:2023-12-24 15:34:22浏览次数:27  
标签:head nn self 网络 cnf V2 EfficientNet

EfficientNet V2网络

目录

前言

EfficientNet V2是2021年4月份发布的,下图是论文中给出的性能参数。

可以看到,EfficientNet V2网络不仅Accuracy达到了当前的SOTA水平,而且训练速度更快参数量更少。

EfficientNet V1中存在的问题

作者系统性的研究了EfficientNet的训练过程,并总结出了三个问题:

  1. 训练图像的尺寸很大时,训练速度非常慢。
  2. 在网络浅层中使用Depthwise convolutions速度会很慢。虽然Depthwise convolutions结构相比普通卷积拥有更少的参数一i及更小的FLOPs,但通常无法充分利用现有的一些加速器。在近些年的研究中,有人提出了Fused-MBConv结构去更好的利用移动端或服务端的加速器。Fused-MBConv的结构也很简单,急将原来的MBConv结构住分支中的expansion conv1 x 1和depthwise conv3 x 3替换成一个普通的conv3 x 3。如下如所示:

  1. 同等的放大每个stage是次优的。在EfficientNet V1中,每个stage的深度和宽度都是同等放大的。但每个stage对网络的训练速度和参数量的贡献并不相同,所以直接使用同等缩放的策略并不合理。在本文中,作者采用了非均匀的缩放策略来缩放模型。

EfficientNet V2中的贡献

  1. 引入新的网络,该网络在训练速度和参数量上都优于先前的一些网络
  2. 提出了改进的渐进学习方法,该方法会根据训练图像的尺寸动态调节正则方法(例如dropout、data augmentation 和mixup)。通过实验展示了该方法不仅能提升训练速度,同时还能提升准确率
  3. 通过实验与先前的网络对比,训练速度提升11倍,参数量减少为\(\frac{1}{6.8}\)

网络框架

与EfficientV1相比,主要有以下不同:

  1. V2中除了使用MBConv模块外,还使用了Fused-MBConv模块
  2. V2中会使用较小的expansion ratio,在V1中基本都是6。这样的好处是能够减少内存访问开销
  3. V2中更偏向使用更小的kernel_size(3 x 3),在V1中很多5 x 5。优于3 x 3的感受野是比5 x 5小的,所以需要堆叠更多的层结构以增加感受野
  4. 移除了V1中最优一个步距为1的stage

Progressive Learning渐进学习策略

代码

class EfficientNetV2(nn.Module):
    def __init__(self,
                 model_cnf: list,
                 num_classes: int = 1000,
                 num_features: int = 1280,
                 dropout_rate: float = 0.2,
                 drop_connect_rate: float = 0.2):
        super(EfficientNetV2, self).__init__()

        for cnf in model_cnf:
            assert len(cnf) == 8

        norm_layer = partial(nn.BatchNorm2d, eps=1e-3, momentum=0.1)

        stem_filter_num = model_cnf[0][4]

        self.stem = ConvBNAct(3,
                              stem_filter_num,
                              kernel_size=3,
                              stride=2,
                              norm_layer=norm_layer)  # 激活函数默认是SiLU

        total_blocks = sum([i[0] for i in model_cnf])
        block_id = 0
        blocks = []
        for cnf in model_cnf:
            repeats = cnf[0]
            op = FusedMBConv if cnf[-2] == 0 else MBConv
            for i in range(repeats):
                blocks.append(op(kernel_size=cnf[1],
                                 input_c=cnf[4] if i == 0 else cnf[5],
                                 out_c=cnf[5],
                                 expand_ratio=cnf[3],
                                 stride=cnf[2] if i == 0 else 1,
                                 se_ratio=cnf[-1],
                                 drop_rate=drop_connect_rate * block_id / total_blocks,
                                 norm_layer=norm_layer))
                block_id += 1
        self.blocks = nn.Sequential(*blocks)

        head_input_c = model_cnf[-1][-3]
        head = OrderedDict()

        head.update({"project_conv": ConvBNAct(head_input_c,
                                               num_features,
                                               kernel_size=1,
                                               norm_layer=norm_layer)})  # 激活函数默认是SiLU

        head.update({"avgpool": nn.AdaptiveAvgPool2d(1)})
        head.update({"flatten": nn.Flatten()})

        if dropout_rate > 0:
            head.update({"dropout": nn.Dropout(p=dropout_rate, inplace=True)})
        head.update({"classifier": nn.Linear(num_features, num_classes)})

        self.head = nn.Sequential(head)

        # initial weights
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                nn.init.kaiming_normal_(m.weight, mode="fan_out")
                if m.bias is not None:
                    nn.init.zeros_(m.bias)
            elif isinstance(m, nn.BatchNorm2d):
                nn.init.ones_(m.weight)
                nn.init.zeros_(m.bias)
            elif isinstance(m, nn.Linear):
                nn.init.normal_(m.weight, 0, 0.01)
                nn.init.zeros_(m.bias)

    def forward(self, x: Tensor) -> Tensor:
        x = self.stem(x)
        x = self.blocks(x)
        x = self.head(x)

        return x

标签:head,nn,self,网络,cnf,V2,EfficientNet
From: https://www.cnblogs.com/horolee/p/efficientNet_v2.html

相关文章

  • 使用代理IP可以解决哪些网络问题?
    随着互联网技术和科技的发展,在上网的时候使用代理ip的使用人数也越来越多,因为业务的需求需要使用代理ip的应用范围越来越多,那么使用代理IP可以解决哪些网络问题?接下来小编就给大家介绍一下:1.个人信息不安全用户正常上网时,一般都是使用自己设备本地IP地址进行网络请求,有时候会造成隐......
  • Http网络协议包
    Http网络协议包一。网络协议包:1.在网络中传递信息都是以【二进制】形式存在的。 2.接收方【浏览器/服务器】在接收信息后,要做第一件事,就是将【二进制数据】进行编译【文字,图片,视频,命令】3.传递信息数据量往往比较巨大,导致接收方很难在一组连续二进制得到对应......
  • linux-网络接口的绑定与组合(bond 网桥的创建)
    网络接口的绑定一、虚拟接口将多个网络逻辑接口连接在一起:1、实现冗余、避免故障2、提高吞吐率原理:非在物理网卡上设置、而是通过多个物理网卡聚合成一个虚拟的网卡(外部网络访问的就是本机的虚拟网卡的地址)二、通过networkmanger实现绑定模式balanceactive-backup--......
  • vmware 虚机网络设置
    VMware三种网络设置方式:参考博客:一文详解Linux三种网络设置方式_Linux_脚本之家(jb51.net)Oracle19CRAC环境配置网络时,publicip、virtualip、scanip(公网ip、vip、scanip)处于同一网段,vip与scanip不用提前在网络文件(ifcfg-ens33...)中设置,只在/etc/hosts文件中设置,oracle......
  • 人工神经网络
    人工神经网络是一种模拟人脑神经网络的机器学习技术,它由输入层、输出层和中间层(也称为隐蔽层)组成若干个节点组成一个层,若干个层组成一个人工神经网络。若一个人工神经网络中只有一个计算层,则称为单层神经网络神经网络输入层的节点数需要与输入数据的维度相匹配,输出层的节点数要与......
  • Python网络编程:掌握urllib包的妙用
    在Python的世界里,处理网络请求是日常任务之一。不论是爬取网页数据,还是调用网络API,一个好用的HTTP客户端库是必不可少的。Python标准库中的urllib包就是这样一个强大的工具,它提供了一个简单的界面来与网上资源互动。本文将带你深入了解urllib包,包括它的主要模块,以及如何使用它们完......
  • 【论文精读#1】SPGAN-DA:用于领域自适应遥感图像语义分割的语义保留生成对抗网络
    作者:YanshengLi发表年代:2023使用的方法:无监督领域自适应(UDA)、GAN、ClassMix、边界增强来源:IEEETGRS方向:语义分割期刊层次:CCFB;工程技术1区;IF8.2文献链接:https://doi.org/10.1109/TGRS.2023.3313883LiY,ShiT,ZhangY,etal.SPGAN-DA:Semantic-Pres......
  • Qt/C++控件设计器/属性栏/组态/可导入导出/中文属性/串口网络/拖曳开发
    一、功能特点自动加载插件文件中的所有控件生成列表,默认自带的控件超过120个。拖曳到画布自动生成对应的控件,所见即所得。右侧中文属性栏,改变对应的属性立即应用到对应选中控件,直观简洁,非常适合小白使用。独创属性栏文字翻译映射机制,效率极高,可以非常方便拓展其他语言的属性......
  • UAV2101~2105串行通信训练
    训练001、单片机与PC机通信,11.0592M晶振,波特率9600。实现任意字符发送。#include<reg52.h>bitbusy;voidSendData(unsignedchardat){while(busy);//判断是否忙busy=1;SBUF=dat;}voidSendString(char*s){while(*s)//Checktheendo......
  • 网络学习笔记(1)计算机网络基础
    计算机网络的定义:计算机网络是一个将分散的、具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享的系统。计算机网络的组成:计算机网络包括硬件、软件、协议三大部分物理组成:硬件:计算机、终端设备,称为主机(host),部分host充当主机,部分host充当......