CNN成长路:从AlexNet到EfficientNet(01)

一、说明

        在 10年的深度学习中,进步是多么迅速!早在 2012 年,Alexnet 在 ImageNet 上的准确率就达到了 63.3% 的 Top-1。现在,我们超过90%的EfficientNet架构和师生训练(teacher-student)。

        如果我们在 Imagenet 上绘制所有报告作品的准确性,我们会得到这样的结果:

图像分类-绘图图像网

来源:Papers with Code - Imagenet Benchmark

在本文中,我们将重点介绍卷积神经网络(CNN)架构的演变。我们将专注于基本原则,而不是报告简单的数字。为了提供另一种视觉概览,可以在单个图像中捕获2018年之前表现最佳的CNN:

深度学习-架构-情节-2018

截至 2018 年的架构概述。资料来源:Simone Bianco et al. 2018

不要惊慌失措。所有描述的体系结构都基于我们将要描述的概念。

请注意,每秒浮点运算数 (FLOP) 表示模型的复杂性,而在垂直轴上,我们有 Imagenet 精度。圆的半径表示参数的数量。

从上图中可以看出,更多的参数并不总是能带来更好的准确性。我们将尝试对CNN进行更广泛的思考,看看为什么这是正确的。

如果您想从头开始了解卷积的工作原理,请推荐 Andrew 的 Ng 课程。

二、第一阶段:CNN架构的递进

2.1 术语解释

        但首先,我们必须定义一些术语:

  • 更宽的网络意味着卷积层中更多的特征图(过滤器)

  • 更深的网络意味着更多的卷积层

  • 具有更高分辨率的网络意味着它处理具有更大宽度和深度(空间分辨率)的输入图像。这样,生成的特征图将具有更高的空间维度。

体系结构缩放类型

架构扩展。来源:谭明兴,Quoc V. Le 2019

架构工程就是关于扩展的。我们将彻底使用这些术语,因此在继续之前请务必理解它们。

2.2 AlexNet: ImageNet Classification with Deep Convolutional Neural Networks (2012)

        Alexnet [1] 由 5 个从 11x11 内核开始的卷积层组成。它是第一个采用最大池化层、ReLu 激活函数和 3 个巨大线性层的 dropout 的架构。该网络用于具有 1000 个可能类的图像分类,这在当时是疯狂的。现在,您可以在 35 行 PyTorch 代码中实现它:

class AlexNet(nn.Module):
    def __init__(self, num_classes: int = 1000) -> None:
        super(AlexNet, self).__init__()
        self.features = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.Conv2d(64, 192, kernel_size=5, padding=2),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.Conv2d(192, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(384, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
        )

        self.avgpool = nn.AdaptiveAvgPool2d((6, 6))
        self.classifier = nn.Sequential(
            nn.Dropout(),
            nn.Linear(256 * 6 * 6, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Linear(4096, num_classes),
        )

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        x = self.features(x)
        x = self.avgpool(x)
        x = torch.flatten(x, 1)
        x = self.classifier(x)
        return x

        这是第一个在 Imagenet 上成功训练的卷积模型,当时在 CUDA 中实现这样的模型要困难得多。Dropout 在巨大的线性变换中大量使用,以避免过度拟合。在 2015-2016 年自动微分出现之前,在 GPU 上实现反向传播需要几个月的时间。

2.3 VGG (2014)

        著名的论文“用于大规模图像识别的非常深度卷积网络”[2]使深度一词病毒式传播。这是第一项提供不可否认证据的研究,证明简单地添加更多层可以提高性能。尽管如此,这一假设在一定程度上是正确的。为此,他们只使用3x3内核,而不是AlexNet。该架构使用 224 × 224 个 RGB 图像进行训练。

        主要原理是一叠三3×3 转换层类似于单个7×7 层。甚至可能更好!因为它们在两者之间使用三个非线性激活(而不是一个),这使得函数更具鉴别性。

        其次,这种设计减少了参数的数量。具体来说,您需要3*(3^2) C^2= 27 \times C^2 权重,与7×7 需要的转换层(1*72)C^2=49C^2  参数(增加 81%)。

        直观地,它可以被视为对7×7 转换过滤器,限制它们具有 3x3 非线性分解。最后,这是规范化开始成为一个相当成问题的架构。

        尽管如此,预训练的VGG仍然用于生成对抗网络中的特征匹配损失,以及神经风格转移和特征可视化。

        以我的拙见,检查凸网相对于输入的特征非常有趣,如以下视频所示:

        最后,在Alexnet旁边进行视觉比较:

斯坦福-讲座-VGG-vs-Alexnet

来源:斯坦福大学2017年深度学习讲座:CNN架构

2.4 InceptionNet/GoogleNet (2014)

        在VGG之后,Christian Szegedy等人的论文“Go Deep with Convolutions”[3]是一个巨大的突破。

        动机:增加深度(层数)并不是使模型变大的唯一方法。如何增加网络的深度和宽度,同时将计算保持在恒定的水平?

        这一次的灵感来自人类视觉系统,其中信息在多个尺度上进行处理,然后在本地聚合[3]。如何在不发生记忆爆炸的情况下实现这一目标?

        答案是1×1 卷 积!主要目的是通过减少每个卷积块的输出通道来减小尺寸。然后我们可以处理具有不同内核大小的输入。只要填充输出,它就与输入相同。

        要找到具有单步幅且无扩张的合适填充,请填充p和内核k被定义为out=in(输入和输出空间调光):

        out=in+2*p-k+1,这意味着p=(k-1)/2..在 Keras 中,您只需指定 padding='same'。这样,我们可以连接与不同内核卷积的特征。

        然后我们需要1×1 卷积层将特征“投影”到更少的通道,以赢得计算能力。有了这些额外的资源,我们可以添加更多的层。实际上,1×1 convs 的工作方式类似于低维嵌入。

有关 1x1 转换的快速概述,请推荐来自著名 Coursera 课程的以下视频:

        这反过来又允许通过使用Inception模块不仅增加深度,而且增加著名的GoogleNet的宽度。核心构建块称为 inception 模块,如下所示:

初始模块

       

        整个架构被称为GoogLeNet或InceptionNet。从本质上讲,作者声称他们试图用正常的密集层近似稀疏的凸网(如图所示)。

        为什么?因为他们相信只有少数神经元是有效的。这符合Hebbian原则:“一起放电的神经元,连接在一起”。

        此外它使用不同内核大小的卷积(5×55×5,3×33×3,1×11×1) 以捕获多个比例下的细节.

通常,对于驻留在全局的信息,首选较大的内核,对于本地分发的信息,首选较小的内核。

        此外1×1 卷积用于在计算成本高昂的卷积(3×3 和 5×5)之前计算约简。

        InceptionNet/GoogLeNet架构由9个堆叠在一起的初始模块组成,其间有最大池化层(将空间维度减半)。它由 22 层组成(27 层带有池化层)。它在上次启动模块之后使用全局平均池化。

        我写了一个非常简单的 Inception 块实现,可能会澄清一些事情:

import torch
import torch.nn as nn

class InceptionModule(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(InceptionModule, self).__init__()
        relu = nn.ReLU()
        self.branch1 = nn.Sequential(
                  nn.Conv2d(in_channels, out_channels=out_channels, kernel_size=1, stride=1, padding=0),
                  relu)

        conv3_1 = nn.Conv2d(in_channels, out_channels=out_channels, kernel_size=1, stride=1, padding=0)
        conv3_3 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1)
        self.branch2 = nn.Sequential(conv3_1, conv3_3,relu)

        conv5_1 = nn.Conv2d(in_channels, out_channels=out_channels, kernel_size=1, stride=1, padding=0)
        conv5_5 = nn.Conv2d(out_channels, out_channels, kernel_size=5, stride=1, padding=2)
        self.branch3 = nn.Sequential(conv5_1,conv5_5,relu)

        max_pool_1 = nn.MaxPool2d(kernel_size=3, stride=1, padding=1)
        conv_max_1 = nn.Conv2d(in_channels, out_channels=out_channels, kernel_size=1, stride=1, padding=0)
        self.branch4 = nn.Sequential(max_pool_1, conv_max_1,relu)

    def forward(self, input):
        output1 = self.branch1(input)
        output2 = self.branch2(input)
        output3 = self.branch3(input)
        output4 = self.branch4(input)
        return torch.cat([output1, output2, output3, output4], dim=1)

model = InceptionModule(in_channels=3,out_channels=32)
inp = torch.rand(1,3,128,128)
print(model(inp).shape)
torch.Size([1, 128, 128, 128])

        当然,您可以在激活函数之前添加规范化层。但由于归一化技术不是很成熟,作者引入了两个辅助分类器。原因是:梯度消失问题)。

2.5 Inception V2, V3 (2015)

后来,在论文“重新思考计算机视觉的初始体系结构”中,作者基于以下原则改进了Inception模型:

  • 将 5x5 和 7x7(在 InceptionV3 中)卷积分别分解为两个和三个 3x3 顺序卷积。这提高了计算速度。这与 VGG 的原理相同。

  • 他们使用了空间上可分的卷积。简单地说,一个 3x3 内核被分解为两个较小的内核:一个 1x3 和一个 3x1 内核,它们按顺序应用。

  • 初始模块变得更宽(更多特征图)。

  • 他们试图在网络的深度和宽度之间以平衡的方式分配计算预算。

  • 他们添加了批量规范化。

inception 模型的更高版本是 InceptionV4 和 Inception-Resnet。

2.6 ResNet:用于图像识别的深度残差学习(2015)

所有预先描述的问题(例如梯度消失)都通过两个技巧得到解决:

  • 批量归一化和

  • 短跳跃连接

        而不是H(x)=F(x) ,我们要求他们模型学习差异(残差)H'(x)=F(x)+x,这意味着H( x) - x=F(x)将是剩余部分 [4]。

跳过连接

来源:斯坦福大学2017年深度学习讲座:CNN架构

        通过这个简单但有效的模块,作者设计了从18层(Resnet-18)到150层(Resnet-150)的更深层次的架构。

        对于最深的模型,他们采用了 1x1 卷积,如右图所示:

跳过连接-1-1-卷积

图片来源:何开明等人,2015年。来源:用于图像识别的深度残差学习

瓶颈层(1×1)层首先减小然后恢复通道尺寸,使3×3层具有较少的输入和输出通道。

        总的来说,这里是整个架构的草图:

Animated GIF

        有关更多详细信息,您可以在ResNets上观看Henry AI Labs的精彩视频:

你可以通过直接从Torchvision导入一堆ResNet来玩它们:

import torchvision
pretrained = True

# A lot of choices :P
model = torchvision.models.resnet18(pretrained)
model = torchvision.models.resnet34(pretrained)
model = torchvision.models.resnet50(pretrained)
model = torchvision.models.resnet101(pretrained)
model = torchvision.models.resnet152(pretrained)
model = torchvision.models.wide_resnet50_2(pretrained)
model = torchvision.models.wide_resnet101_2(pretrained)

n.models.wide_resnet101_2(pretrained)

试试吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/61910.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于 Debian GNU/Linux 12 “书虫 “的Neptune 8.0 “Juna “来了

导读Neptune Linux 发行版背后的团队发布了 Neptune 8.0,作为这个基于 Debian 的 GNU/Linux 发行版的重大更新,它围绕最新的 KDE Plasma 桌面环境构建。 Neptune 8.0 被命名为 “Juna”,是在Neptune 7.5 发布 11 个月后发布的,也是…

【零基础学Rust | 基础系列 | 函数,语句和表达式】函数的定义,使用和特性

文章标题 简介一,函数1,函数的定义2,函数的调用3,函数的参数4,函数的返回值 二,语句和表达式1,语句2,表达式 总结: 简介 在Rust编程中,函数,语句…

Pytest测试框架1

目录: 1.pytest简介、安装与准备2.pytest命名规则3.pycharm配置与界面化运行4.pytest测试用例结构5.pytest测试用例断言6.pytest测试框架结构7.计算器实战 1.pytest简介、安装与准备 前言 自动化测试前,需要提前准备好数据,测试完成后&am…

操作系统复习总结1

操作系统复习总结,仅供笔者复习使用,参考教材: 《操作系统原理》 - 何静媛编著. 西安电子科技大学出版社《操作系统考研复习指导》2024年 - 王道论坛组编. 电子工业出版社 本文主要内容为:计算机系统概述; 计算机系…

String类及其工具类

一、String类 1.字符串对象 String str new String("hello");String对象是final修饰的,不可修改的,修改后的字符串对象是另外一个对象,只是修改了引用地址。每次创建都会创建一个新的对象。 2. 字面量 String s "hello&…

首批获得金融级行业云平台认证,天翼云深耕行业云

云计算下半场看什么? 无疑是金融、政务、制造等传统政企用户的上云与用云。随着数字经济发展和产业数字化的提速,上云已是政企用户推动其数字化转型不断深入的重要抓手,成为不可阻挡的趋势。 与互联网用户相比,政企用户上云极为…

uni-app——下拉框多选

一、组件components/my-selectCheckbox.vue <template><view class"uni-stat__select"><span v-if"label" class"uni-label-text">{{label &#xff1a;}}</span><view class"uni-stat-box" :class"…

mediasoup Lite ICE实现说明

目录 一. 前言 二. Lite ICE流程 三. STUN协议说明 STUN Header STUN Body 四. mediasoup Lite ICE实现源码剖析 一. 前言 ICE 是一种交互式建立连接的流程协议。ICE 有两种模式&#xff08;Full ICE 和 Lite ICE&#xff09;&#xff0c;Full ICE 要求建立连接的双方都要…

ruoyi若依 组织架构设计--[ 角色管理 ]

ruoyi若依 组织架构设计--[ 角色管理 ] 角色新增后端代码 角色修改后端代码 角色查询角色删除角色分配数据权限后端代码 角色分配用户 角色新增 后端代码 有一点&#xff0c;我认为新增的时候&#xff0c;也需要修改redis中的权限。 角色修改 后端代码 因为修改了role_menu表了…

坚鹏:中国邮储银行金融科技前沿技术发展与应用场景第2期培训

中国邮政储蓄银行金融科技前沿技术发展与应用场景第2期培训圆满结束 中国邮政储蓄银行拥有优良的资产质量和显著的成长潜力&#xff0c;是中国领先的大型零售银行。2016年9月在香港联交所挂牌上市&#xff0c;2019年12月在上交所挂牌上市。中国邮政储蓄银行拥有近4万个营业网点…

hcip——期中小试

要求&#xff1a; 1、该拓扑为公司网络&#xff0c;其中包括公司总部、公司分部以及公司骨干网&#xff0c;不包含运营商公网部分。 2 、设备名称均使用拓扑上名称改名&#xff0c;并且区分大小写。 3 、整张拓扑均使用私网地址进行配置。 4 、整张网络中&#xff0c;运行 O…

Unity Sort Group(排序组)

** Unity 中的Sort Group组组件允许让Sprite Renderer(精灵渲染器)重新决定渲染顺序. ** 作为组件存在 组件内容&#xff1a; Unity 使用Sort Group 组件的Sort layer 和Order in layer的值来确定排序组在渲染队列内相对与场景内其他排序组和游戏对象的优先级。 属性功能So…

最新2024届【海康威视】内推码【GTK3B6】

最新2024届【海康威视】内推码【GTK3B6】 【内推码使用方法】 1.请学弟学妹们登录校招官网&#xff0c;选择岗位投递简历&#xff1b; 2.投递过程中填写内推码完成内推步骤&#xff0c;即可获得内推特权。 内推码&#xff1a;GTK3B6 内推码&#xff1a;GTK3B6 内推码&…

【Python】基础数据结构:列表——元组——字典——集合

文章目录 一、简述二、Python中的列表详解2.1 创建列表2.2 访问列表元素2.3 修改列表元素2.4 列表切片2.5 列表方法2.6 列表推导式 三、Python中的元组详解3.1 创建元组3.2 访问元组元素3.3 元组是不可变的3.4 元组切片3.5 元组方法 四、Python中的字典详解4.1 创建字典4.2 访问…

ES6基础知识十:你是怎么理解ES6中 Decorator 的?使用场景?

一、介绍 Decorator&#xff0c;即装饰器&#xff0c;从名字上很容易让我们联想到装饰者模式 简单来讲&#xff0c;装饰者模式就是一种在不改变原类和使用继承的情况下&#xff0c;动态地扩展对象功能的设计理论。 ES6中Decorator功能亦如此&#xff0c;其本质也不是什么高大…

避免安装这5种软件,手机广告频繁弹窗且性能下降

在我们使用手机的日常生活中&#xff0c;选择合适的应用软件对于保持良好的使用体验至关重要。然而&#xff0c;有些软件可能会给我们带来不必要的麻烦和困扰。特别是那些频繁弹窗广告、导致手机性能下降的应用程序&#xff0c;我们应该尽量避免安装它们。 首先第一种&#xf…

VR实景导航——开启3D可视化实景导航新体验

数字化时代&#xff0c;我们大家出门在外都是离不开各种导航软件&#xff0c;人们对导航的需求也越来越高&#xff0c;而传统的导航软件由于精度不够&#xff0c;无法满足人们对真实场景的需求&#xff0c;这个时候就需要VR实景导航为我们实景指引目的地的所在。 VR实景导航以其…

【数理知识】协方差,随机变量的的协方差,随机变量分别是单个数字和向量时的协方差

序号内容1【数理知识】自由度 degree of freedom 及自由度的计算方法2【数理知识】刚体 rigid body 及刚体的运动3【数理知识】刚体基本运动&#xff0c;平动&#xff0c;转动4【数理知识】向量数乘&#xff0c;内积&#xff0c;外积&#xff0c;matlab代码实现5【数理知识】协…

使用WebMvcConfigurationSupport后导致原来返回的json数据变为了xml的解决方法

问题 未使用WebMvcConfigurationSupport拦截时返回的数据都是JSON格式&#xff0c;使用WebMvcConfigurationSupport做拦截后数据的返回变为了XML的格式。 原因 在Spring框架中&#xff0c;WebMvcConfigurationSupport 是一个类&#xff0c;它可以用于自定义Spring MVC的配置…

P1833 樱花(多重背包)(内附封面)

樱花 题目背景 《爱与愁的故事第四弹plant》第一章。 题目描述 爱与愁大神后院里种了 n n n 棵樱花树&#xff0c;每棵都有美学值 C i ( 0 ≤ C i ≤ 200 ) C_i(0 \le C_i \le 200) Ci​(0≤Ci​≤200)。爱与愁大神在每天上学前都会来赏花。爱与愁大神可是生物学霸&#…