AlexNet到底是什么?

投资家兼企业家Peter Thiel最喜欢的问题是:很少人赞同你的重要事实有哪些?

如果你在2010年向Geoffrey Hinton教授提出这个问题,他会回答道,卷积神经网络(CNN)有可能在解决图像分类问题上发挥巨大的作用当时,该领域的研究人员并不重视这一言论因为深度学习太平淡无奇了。

2010ImageNet项目的大规模视觉识别挑战(ILSVRC)启动。

随后的两年时间里,Alex KrizhevskyIlya SutskeverGeoffrey E. Hinton的论文利用深度卷积神经网络对图像进行分类发表,这是前所未有的震撼!这篇论文以一种巧妙的手法打破了旧观念,开创了计算机视觉的新局面。

在接下来的几年里,多个团队将构建CNN体系结构期望超越人类层面的准确性。2012年论文中使用的架构通常被称为AlexNet第一作者Alex Krizhevsky的名字命名。本文将回顾AlexNet的架构并讨论它的主要贡献。

输入

AlexNet2012ImageNet项目的大规模视觉识别挑战(ILSVRC)中的胜出者AlexNet解决了图像分类的问题,输入是1000个不同类型图像(如猫、狗等)中的一个图像,输出是1000个数字的矢量。输出向量的第i元素即为输入图像属于第i图像的概率。因此,输出向量的所有元素之和为1

AlexNet的输入是一个大小为256×256RGB图像。因此所有的训练集图像和测试图像的大小都要为256×256

如果输入图像的大小不是256×256那么用它来训练神经网络之前需要将其转换成256×256的大小。为了实现这一转换将图像尺寸缩小成256,最终剪裁获得一个大小为256×256图像。下图显示了一个示例

a30d752652138dca9f45b8cc59c872622fe4836b

如果输入图像为灰度图像,可以通过复制单个通道将其转换成一个3通道的RGB图像。由256×256的图像可产生随机大小的图像,其中大小为227×227图像来填充AlexNet的第一层。

AlexNet架构

与用于计算机视觉设计的CNN相比,AlexNet要大得多。AlexNet6000万个参数和65万个神经元,并且花了五到六天的时间来训练两个GTX 580。现在有很多更复杂的CNNs即使是在非常大的数据集中,也可以高效地运行在更快的GPUs上。

AlexNet架构如下图所示:

50406bc5020b03655e525f64df06c75b8e1aab57

AlexNet5个卷积层和3个全连接层组成

多个卷积内核(a.k.a过滤器)可以提取图像中有趣的特征。通常,同一卷积层中内核的大小是相同的。例如,AlexNet的第一个Conv层包含96个大小为11x11x3的内核。值得注意的是,内核的宽度和高度通常是相同的,深度与通道的数量是相同的。

前两个卷积层后面是重叠的最大池层第三、第四和第五个卷积层都是直接相连的。第5个卷积层后面是一个重叠的最大池层,它的输出进入两个全连接层。第二个全连接层可以给softmax分类器提供1000类标签。

在所有的卷积和全连接层之后,应用ReLU非线性函数首先第一和第二个卷积层都应用ReLU非线性函数,然后进行局部标准化,最后执行pooling操作方法。但后来研究人员发现标准化并不是很有用所以这里不详细论述

重叠最大池化

通常使用最大池化层来对张量的宽度和高度进行采样,保持深度不变。重叠的最大池层与最大池层类似,除了重叠最大池层的相邻窗口是相互重叠的。作者使用口是大小3×3,相邻窗口步幅2窗口。在输出尺寸相同的情况下,与使用大小为2×2,相邻窗口步幅为2的非重叠池化窗口相比,重叠池化窗口能够分别将第一名的错误率降低0.4%,第5名的错误率降低0.3%

ReLU非线性

AlexNet一个重要特性是使用ReLU(整流线性单元)非线性。Tanhsigmoid激活函数曾是训练神经网络模型的常用方法。与使用tanhsigmoid这样的饱和激活函数相比,使用ReLU非线性可以使深度CNNs训练更快。本文的下图显示,使用tanh(点线)的等效网络相比,使用ReLUs(solid曲线)AlexNet能以6倍快的速度到达25%的训练错误率CIFAR-10数据集中完成的测试。

bfcaf2488f837f81ebcc29b97b6b4620b4d5686a

为什么ReLUs训练得更快ReLU函数f(x)= max(0,x)

a8f1d26be4824db9b562ffaf8dffab8a2985aa65

上面是tanhReLU两个函数的图。tanh函数在z值很高或很低时饱和,函数的斜率接近于0,有助于减缓梯度下降。另一方面,z为较大的正值时ReLU函数的斜率不接近于零,有助于优化收敛得更快。z为负值时斜率为零,但是神经网络中的大多数神经元最终都具有正值。sigmoid函数也因为同样的原因,稍逊于ReLU

减少过度拟合

什么是拟合?

还记得你的中学同学他在考试中表现得很好,但是当考试的问题需要有创造性的思考时,他却表现得很差。为什么他在遇到以前从未遇到过的问题时表现得如此糟糕因为他记住了课堂上所涉及的问题的答案,而没有理解潜在的概念。

类似地,神经网络的大小就是它的学习能力。一不小心,它会在不理解概念的情况下记住训练数据中的例子。虽然神经网络在训练数据上表现得格外的好,但是他们没有学习到真正的概念。在面对新的、未见过的测试数据时,的表现就没有那么好了。这就是所谓的过度拟合。

AlexNet使用了几种不同的方法来减少过拟合。

数据增强

神经网络中涉及到同一图像的不同变化时有助于防止过拟合。强迫神经网络不去记忆通常从现有数据中生成额外的数据以下是AlexNet团队使用的一些技巧。

通过镜像实现数据增强

如果训练集中有一只猫的图像,那么它的镜像也是一只猫。请参见下图中的示例。通过垂直轴简单地翻转图像,训练数据集可变为原来的两倍

ce727dcf30e04dfd538a006706612fb208c0f050

通过随机裁剪实现数据增强

此外,随机裁剪原始图像也会导致额外的数据,即原始数据的移位版本。

AlexNet的作者从大小为256×256的图像中随机裁剪出大小227×227图像,并作为网络的输入。使用这种方法将数据的大小变为原来的2048倍。

a1f5e8973551ada7934788577e9901490215892d

值得注意的是,这四个随机裁剪的图像看起来非常相似,但它们并不完全相同。神经网络来说虽然像素微小移动,但图像仍然是一只猫。如果没有数据增强,作者会因为严重的过度拟合而无法使用如此庞大的网络

Dropout

对大约60000000参数的训练,作者也尝试过用其他方法来减少过度拟合。其中采用了一种叫做dropout的技术,G.E. Hinton2012年的另一篇论文中介绍了该技术。在丢弃过程中,一个神经元被从网络中丢弃的概率为0.5。当一个神经元被丢弃时,并不影响正向传播和反向传播。如下面的动画所示每个输入都经过不同的网络架构因此,所学习的权重参数更可靠不易被装配。在测试过程中,全网络参与没有遗漏,但是由于神经元丢失输出变为原来的一半丢弃技术使迭代次数收敛到2如果没有使用丢弃技术AlexNet的过拟合会更加严重

987f69f31e791db5b3f75c14282c4d2693846e54

参考文献:

1.利用深度卷积神经网络对图像进行分类.Alex Krizhevsky, Ilya Sutskever, Geoffrey E. Hinton, 2012;

2.Coursera课程的卷积神经网络,也Andrew Ng深度学习专业课程的一部分。

数十款阿里云产品限时折扣中,赶紧点击领券开始云上实践吧!

本文由阿里云云栖社区组织翻译。

文章原标题《understanding-alexnet

作者:snayak 译者:吴兆青,审校:袁虎。

文章为简译,更为详细的内容,请查看原文文章

### AlexNet 和 VGG 网络模型特点比较 #### AlexNet 的特性 AlexNet 是由 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 在 2012 年提出的深度卷积神经网络,在 ImageNet 比赛中的表现引起了轰动,并且用 PyTorch 实现了 AlexNet[^1]。该模型具有以下特征: - **层数较少**:相比后来的 VGG,AlexNet 只有8层可训练参数(5个卷积层和3个全连接层),这使得其结构相对简单。 - **较大滤波器尺寸**:使用较大的卷积核大小 (11×11, 5×5),以及步幅为4的最大池化操作。 - **ReLU激活函数**:引入 ReLU 非线性激活单元来加速收敛过程并减少过拟合风险。 - **Dropout正则化技术**:在网络顶层采用 dropout 方法防止过拟合现象的发生。 ```python import torch.nn as nn class AlexNet(nn.Module): def __init__(self, num_classes=1000): 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), # ...其他层... ) ``` #### VGG 网络的特点 VGG 提供了深层网络设计的范例,强调了深度的优势。具体来说: - **更深更宽**:拥有更多的卷积层(最多可达19层),每层都保持较小的感受野(3x3 卷积核)。 - **统一配置**:几乎所有的卷积层均采用了相同的小型过滤器尺寸(3×3),并且每次下采样之后都会增加通道数。 - **简化的设计原则**:仅依靠堆叠简单的组件构建复杂而强大的分类器;不依赖复杂的模块组合方式。 ```python cfgs = { 'A': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'], } def make_layers(cfg, batch_norm=False): layers = [] in_channels = 3 for v in cfg: if v == 'M': layers += [nn.MaxPool2d(kernel_size=2, stride=2)] else: conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1) if batch_norm: layers += [conv2d, nn.BatchNorm2d(v), nn.ReLU(inplace=True)] else: layers += [conv2d, nn.ReLU(inplace=True)] in_channels = v return nn.Sequential(*layers) class VGG(nn.Module): def __init__(self, features, num_classes=1000, init_weights=True): super(VGG, self).__init__() self.features = features self.avgpool = nn.AdaptiveAvgPool2d((7, 7)) self.classifier = nn.Sequential( nn.Linear(512 * 7 * 7, 4096), nn.ReLU(True), nn.Dropout(), nn.Linear(4096, 4096), nn.ReLU(True), nn.Dropout(), nn.Linear(4096, num_classes), ) if init_weights: self._initialize_weights() def forward(self, x): x = self.features(x) x = self.avgpool(x) x = torch.flatten(x, 1) x = self.classifier(x) return x def _initialize_weights(self): for m in self.modules(): if isinstance(m, nn.Conv2d): nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu') if m.bias is not None: nn.init.constant_(m.bias, 0) elif isinstance(m, nn.BatchNorm2d): nn.init.constant_(m.weight, 1) nn.init.constant_(m.bias, 0) elif isinstance(m, nn.Linear): nn.init.normal_(m.weight, 0, 0.01) nn.init.constant_(m.bias, 0) vgg11 = VGG(make_layers(cfgs['A'])) print(vgg11) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值