深度卷积神经网络(AlexNet)

AlexNet是2012年推出的一种深度卷积神经网络,它在ImageNet竞赛中取得显著成绩,展示了深度学习在图像识别上的优势。相比LeNet,AlexNet更深更宽,使用ReLU激活函数,Dropout和数据增广来对抗过拟合。文章还提到了AlexNet的架构细节和其对后续研究的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.基础简介

1.1基础介绍

1.2基础架构 

2.Alexnet与LeNet的对比

3.参考代码

4.李沐老师给出的例子


1.基础简介

1.1基础介绍

2012年,AlexNet横空出世。它首次证明了学习到的特征可以超越手工设计的特征。它一举打破了计算机视觉研究的现状。 AlexNet使用了8层卷积神经网络,并以很大的优势赢得了2012年ImageNet图像识别挑战赛。

AlexNet并不是第一个赢得图像识别竞赛的GPU实现的高速卷积神经网络。 K. Chellapilla et al. (2006)在GPU上的卷积神经网络比CPU上的等效实现快四倍,Dan Cireřan等人(4)在IDSIA的深度卷积神经网络已经快了2011倍,并在5年2011月取得了超人的性能。 在6年2011月5日至15年2012月9日期间,他们的卷积神经网络赢得了四次以上的图像竞赛。 它还显著更新了文献中多个图像数据库的最高性能

根据AlexNet的一篇论文Cireřan的早期网络“有些相似”。 两者都最初是用 CUDA 编写的,可以在 GPU 上运行。 事实上,两者都是Yann Lucan等人(1989)发表的卷积神经网络设计的变体,而福岛邦彦(称为neocognitron)则认为。 这种结构后来被J. Weng的技术修改,称为最大池化。

2015年,AlexNet赢得了亚洲研究院Microsoft 2015多层的超深度卷积神经网络,赢得了ImageNet 100竞赛。

1.2基础架构 

  • 第一层:11x11的96通道卷积,步长为4,后接ReLU激活函数和局部响应归一化(LRN),再接3x3的最大池化,步长为2。
  • 第二层:5x5的256通道卷积,步长为1,后接ReLU激活函数和LRN,再接3x3的最大池化,步长为2。
  • 第三层:3x3的384通道卷积,步长为1,后接ReLU激活函数。
  • 第四层:3x3的384通道卷积,步长为1,后接ReLU激活函数。
  • 第五层:3x3的256通道卷积,步长为1,后接ReLU激活函数和3x3的最大池化,步长为2。
  • 第六层:4096个神经元的全连接层,后接ReLU激活函数和Dropout。
  • 第七层:4096个神经元的全连接层,后接ReLU激活函数和Dropout。
  • 第八层:1000个神经元的全连接层,输出类别预测。

AlexNet使用了两个GPU来并行训练网络,并在第三、第四、第五层中使用跨GPU的连接来增加模型容量。AlexNet在ImageNet数据集上达到了15.3%的top-5错误率,比第二名低了10.8个百分点。AlexNet是计算机视觉领域最具影响力的论文之一,它证明了深度学习在图像识别任务上的优越性,并促进了更多基于CNN和GPU的研究。

2.Alexnet与LeNet的对比

首先对比两者的架构图,具有明显的进步,Alexnet具有更大更深的网络:

AlexNet和LeNet的异同如下:

  • 相同点:都是基于卷积神经网络的图像分类模型,都使用了卷积层、池化层和全连接层的组合来提取图像特征。
  • 不同点
    • AlexNet比LeNet更深更宽,有更多的参数和计算量。
    • AlexNet使用了ReLU激活函数,而LeNet使用了sigmoid激活函数。
    • AlexNet使用了Dropout来抑制过拟合,而LeNet没有。
    • AlexNet使用了数据增广来扩充训练集,而LeNet没有。
    • AlexNet使用了不同大小的卷积核(11x11, 5x5, 3x3),而LeNet只使用了5x5的卷积核。
    • AlexNet使用了最大池化,而LeNet使用了平均池化

3.参考代码

如果你想写一个AlexNet的代码,你可以参考以下的资源:

4.李沐老师给出的例子

import torch
from torch import nn
from d2l import torch as d2l

net = nn.Sequential(
    # 这里使用一个11*11的更大窗口来捕捉对象。
    # 同时,步幅为4,以减少输出的高度和宽度。
    # 另外,输出通道的数目远大于LeNet
    nn.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,而非论文中的1000
    nn.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)

将AlexNet直接应用于Fashion-MNIST的一个问题是,Fashion-MNIST图像的分辨率(28×28像素)低于ImageNet图像。 为了解决这个问题,我们将它们增加到224×224(通常来讲这不是一个明智的做法,但在这里这样做是为了有效使用AlexNet架构)。 这里需要使用d2l.load_data_fashion_mnist函数中的resize参数执行此调整。 

 读取数据集:

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())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进步小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值