有哪些可以做问卷赚钱的网站,品牌推广方案,工程在哪个网站做推广比较合适,网站宽屏版一、说明 在 10年的深度学习中#xff0c;进步是多么迅速#xff01;早在 2012 年#xff0c;Alexnet 在 ImageNet 上的准确率就达到了 63.3% 的 Top-1。现在#xff0c;我们超过90%的EfficientNet架构和师生训练#xff08;teacher-student#xff09;。 如果我们在 Ima…一、说明 在 10年的深度学习中进步是多么迅速早在 2012 年Alexnet 在 ImageNet 上的准确率就达到了 63.3% 的 Top-1。现在我们超过90%的EfficientNet架构和师生训练teacher-student。 如果我们在 Imagenet 上绘制所有报告作品的准确性我们会得到这样的结果 来源Papers with Code - Imagenet Benchmark
在本文中我们将重点介绍卷积神经网络CNN架构的演变。我们将专注于基本原则而不是报告简单的数字。为了提供另一种视觉概览可以在单个图像中捕获2018年之前表现最佳的CNN 截至 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_size11, stride4, padding2),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size3, stride2),nn.Conv2d(64, 192, kernel_size5, padding2),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size3, stride2),nn.Conv2d(192, 384, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.Conv2d(384, 256, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.Conv2d(256, 256, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size3, stride2),)self.avgpool nn.AdaptiveAvgPool2d((6, 6))self.classifier nn.Sequential(nn.Dropout(),nn.Linear(256 * 6 * 6, 4096),nn.ReLU(inplaceTrue),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(inplaceTrue),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 层。甚至可能更好因为它们在两者之间使用三个非线性激活而不是一个这使得函数更具鉴别性。 其次这种设计减少了参数的数量。具体来说您需要 权重与7×7 需要的转换层 参数增加 81%。 直观地它可以被视为对7×7 转换过滤器限制它们具有 3x3 非线性分解。最后这是规范化开始成为一个相当成问题的架构。 尽管如此预训练的VGG仍然用于生成对抗网络中的特征匹配损失以及神经风格转移和特征可视化。 以我的拙见检查凸网相对于输入的特征非常有趣如以下视频所示 最后在Alexnet旁边进行视觉比较 来源斯坦福大学2017年深度学习讲座CNN架构
2.4 InceptionNet/GoogleNet 2014 在VGG之后Christian Szegedy等人的论文“Go Deep with Convolutions”[3]是一个巨大的突破。 动机增加深度层数并不是使模型变大的唯一方法。如何增加网络的深度和宽度同时将计算保持在恒定的水平 这一次的灵感来自人类视觉系统其中信息在多个尺度上进行处理然后在本地聚合[3]。如何在不发生记忆爆炸的情况下实现这一目标 答案是1×1 卷 积主要目的是通过减少每个卷积块的输出通道来减小尺寸。然后我们可以处理具有不同内核大小的输入。只要填充输出它就与输入相同。 要找到具有单步幅且无扩张的合适填充请填充p和内核k被定义为输入和输出空间调光 这意味着.在 Keras 中您只需指定 paddingsame。这样我们可以连接与不同内核卷积的特征。 然后我们需要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 nnclass 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_channelsout_channels, kernel_size1, stride1, padding0),relu)conv3_1 nn.Conv2d(in_channels, out_channelsout_channels, kernel_size1, stride1, padding0)conv3_3 nn.Conv2d(out_channels, out_channels, kernel_size3, stride1, padding1)self.branch2 nn.Sequential(conv3_1, conv3_3,relu)conv5_1 nn.Conv2d(in_channels, out_channelsout_channels, kernel_size1, stride1, padding0)conv5_5 nn.Conv2d(out_channels, out_channels, kernel_size5, stride1, padding2)self.branch3 nn.Sequential(conv5_1,conv5_5,relu)max_pool_1 nn.MaxPool2d(kernel_size3, stride1, padding1)conv_max_1 nn.Conv2d(in_channels, out_channelsout_channels, kernel_size1, stride1, padding0)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], dim1)model InceptionModule(in_channels3,out_channels32)
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
所有预先描述的问题例如梯度消失都通过两个技巧得到解决 批量归一化和 短跳跃连接 而不是 我们要求他们模型学习差异残差这意味着将是剩余部分 [4]。 来源斯坦福大学2017年深度学习讲座CNN架构 通过这个简单但有效的模块作者设计了从18层Resnet-18到150层Resnet-150的更深层次的架构。 对于最深的模型他们采用了 1x1 卷积如右图所示 图片来源何开明等人2015年。来源用于图像识别的深度残差学习 瓶颈层1×1层首先减小然后恢复通道尺寸使3×3层具有较少的输入和输出通道。 总的来说这里是整个架构的草图 有关更多详细信息您可以在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)
试试吧