1、AlexNet网络模型介绍:
AlexNet 是一种深度卷积神经网络,由Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 在2012年开发。它是深度学习领域的重要里程碑,因为它在当年的 ImageNet 大规模图像分类竞赛(ILSVRC)上取得了显著的胜利,大大降低了图像分类错误率,标志着深度卷积神经网络的复兴。
以下是关于 AlexNet 的一些关键特点:
-
深度网络:相对于以前的神经网络,AlexNet 是一个相对较深的卷积神经网络,有8层卷积和全连接层。这种深度有助于网络更好地学习到图像中的特征。
-
卷积层和池化层:AlexNet 采用了交替的卷积层和池化层。这些卷积层用于检测图像中的特征,如边缘、纹理和形状,而池化层用于减小特征图的空间分辨率。
-
ReLU 激活函数:与传统的激活函数(如 Sigmoid 和 Tanh)不同,AlexNet 引入了修正线性单元(ReLU)作为激活函数。这有助于加速网络的训练,因为它减少了梯度消失问题。
-
局部响应归一化(LRN):AlexNet 在卷积层之间引入了局部响应归一化层,以增强网络的泛化性能。
-
Dropout:为了减少过拟合,AlexNet 引入了 Dropout 层,随机地在训练过程中关闭一部分神经元。
-
多GPU训练:AlexNet 是早期采用多GPU进行训练的神经网络之一,这种并行训练方法有助于加速训练过程。
-
大规模数据集:AlexNet 的成功也得益于大规模的 ImageNet 数据集,这个数据集包括数百万张标记图像,涵盖了1000个不同的类别。
-
ImageNet 竞赛胜利:AlexNet 在2012年 ImageNet 竞赛上一举夺魁,将图像分类错误率大幅降低,标志着深度学习的崭露头角。
AlexNet 的成功对深度学习产生了深远的影响,激发了更多对深度卷积神经网络的研究和应用。它表明深度神经网络在计算机视觉任务中的潜力,并开启了深度学习在图像分类、目标检测和其他视觉任务中的广泛应用。
2、AlexNet取得成功的原因
AlexNet 网络之所以取得成功,有以下关键原因:
-
深度网络结构:AlexNet 是相对较深的神经网络,拥有8层卷积和全连接层。这种深度有助于网络更好地学习到图像中的高级特征和抽象表示。
-
ReLU 激活函数:AlexNet 引入了修正线性单元(ReLU)作为激活函数,相较于传统的 Sigmoid 函数,ReLU 更容易训练,减轻了梯度消失问题,使网络更快地收敛。
-
大规模数据集:AlexNet 的成功得益于大规模的 ImageNet 数据集,该数据集包含数百万张标记图像,具有丰富的多样性和复杂性,有助于网络更好地泛化到新的图像。
-
多GPU训练:AlexNet 是早期采用多GPU训练的神经网络之一。通过并行处理,可以加速网络的训练速度,使得更深层次的网络训练成为可能。
-
局部响应归一化(LRN):AlexNet 引入了局部响应归一化层,有助于提高网络的泛化性能,特别是在竞赛数据集上。
-
Dropout:为了减少过拟合,AlexNet 引入了 Dropout 层,通过随机关闭一部分神经元,增加了网络的鲁棒性。
-
ImageNet 竞赛胜利:AlexNet 在2012年 ImageNet 竞赛中取得了显著胜利,将图像分类错误率大幅降低,表明深度卷积神经网络在大规模图像分类任务上的卓越性能。
-
研究团队的贡献:AlexNet 的成功也归功于团队的卓越工作,包括网络结构的设计、训练策略的选择和超参数的调整。
AlexNet 的成功标志着深度学习的复兴,激发了对卷积神经网络和深度学习的广泛研究和应用。它为计算机视觉领域和其他领域的深度学习研究奠定了坚实的基础。
2、网络结构图:
AlexNet由8层组成:5个卷积层、2个全连接隐藏层和1个全连接输出层.
在AlexNet的第一层,卷积窗口的形状是11×11。 由于ImageNet中大多数图像的宽和高比MNIST图像的多10倍以上,因此,需要一个更大的卷积窗口来捕获目标。 第二层中的卷积窗口形状被缩减为5×5,然后是3×3。 此外,在第一层、第二层和第五层卷积层之后,加入窗口形状为3×3、步幅为2的最大汇聚层。 而且,AlexNet的卷积通道数目是LeNet的10倍。
在最后一个卷积层后有两个全连接层,分别有4096个输出。 这两个巨大的全连接层拥有将近1GB的模型参数。 由于早期GPU显存有限,原版的AlexNet采用了双数据流设计,使得每个GPU只负责存储和计算模型的一半参数。 幸运的是,现在GPU显存相对充裕,所以现在很少需要跨GPU分解模型(因此,本书的AlexNet模型在这方面与原始论文稍有不同)。
图 从LeNet(左)到AlexNet(右)
3、使用的数据集:
这里使用的是Fashion-MNIST数据集,训练AlexNet。 原文中AlexNet是在ImageNet上进行训练的,数据集比较大,因为即使在现代GPU上,训练ImageNet模型,同时使其收敛可能需要数小时或数天的时间。而这里训练下来,使用RTX4090,收敛大约在10-20分钟之间。
4、代码:
基于PyTorch架构的。自己实际运行过的,没有问题。需要安装d2l库。参考动手深度学习一书。
import torch
from torch import nn
from d2l import torch as d2lnet = nn.Sequential(# 这里使用一个11*11的更大窗口来捕捉对象。# 同时,步幅为4,以减少输出的高度和宽度。# 另外,输出通道的数目远大于LeNetnn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2),# 减小卷积窗口,使用填充为2来使得输入与输出的高和宽一致,且增大输出通道数nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2),# 使用三个连续的卷积层和较小的卷积窗口。# 除了最后的卷积层,输出通道的数量进一步增加。# 在前两个卷积层之后,汇聚层不用于减少输入的高度和宽度nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2),nn.Flatten(),# 这里,全连接层的输出数量是LeNet中的好几倍。使用dropout层来减轻过拟合nn.Linear(6400, 4096), nn.ReLU(),nn.Dropout(p=0.5),nn.Linear(4096, 4096), nn.ReLU(),nn.Dropout(p=0.5),# 最后是输出层。由于这里使用Fashion-MNIST,所以用类别数为10,而非论文中的1000nn.Linear(4096, 10))X = torch.randn(1, 1, 224, 224)
for layer in net:X=layer(X)print(layer.__class__.__name__,'output shape:\t',X.shape)batch_size = 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)lr, num_epochs = 0.01, 10
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())d2l.plt.show()
5、运行结果显示
loss 0.333, train acc 0.881, test acc 0.883 5397.5 examples/sec on cuda:0
5、小结
-
AlexNet的架构与LeNet相似,但使用了更多的卷积层和更多的参数来拟合大规模的ImageNet数据集。
-
今天,AlexNet已经被更有效的架构所超越,但它是从浅层网络到深层网络的关键一步。
-
尽管AlexNet的代码只比LeNet多出几行,但学术界花了很多年才接受深度学习这一概念,并应用其出色的实验结果。这也是由于缺乏有效的计算工具。
-
Dropout、ReLU和预处理是提升计算机视觉任务性能的其他关键步骤。