深度学习-深度卷积神经网络AlexNet

1 背景

AlexNet由多伦多大学的Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton在2012年的ImageNet图像分类竞赛中提出,并以优异成绩获得第一名。在此之前,虽然上一节介绍的LeNet获得了一定影响力,但由于当时的算力不足和数据集较小,卷积神经网络并没有得到广泛应用。ImageNet数据集和AlexNet的出现改变了这一切,开启了卷积神经网络的时代。

2 原理

为了增加算力,AlexNet实际设计了两个GPU并行计算的结构,如下图所示

为了方便理解本质, 书中忽略了AlexNet模型在双GPU上运行的特点,并将其结构和LetNet进行了对比:

图中可以看到AlexNet基于LeNet的几个改进:1.输入数据规模更大了,通道数、高度、宽度都增加了。2.多了3个卷积层和一个汇聚层,网络更深了。3.卷积层的卷积核和全连接层的节点数更多了,卷积和汇聚窗口也有所调整,总体来看,除了汇聚层,每一层参数变多了。

除了图中能看到的改进,还有一些没有画出来的改进:1.AlexNet将sigmoid激活函数更改为ReLU激活函数,ReLU激活函数的计算更简单,而且能有效避免梯度消失问题。2.AlexNet通过暂退法控制全连接层的模型复杂度,而LeNet只使用了权重衰减。3.为了进一步扩充数据,AlexNet在训练时增加了大量的图像增强数据,如翻转、裁切和变色。 这使得模型更健壮,更大的样本量有效地减少了过拟合。

有一点需要注意,虽然书中提到了LeNet和AlexNet都用了权重衰减,但是实现的d2l.train_ch6()函数中的SGD优化器中没有指定衰减率,似乎没有进行权重衰减。

3 实现

3.1 模型定义

由于数据集还是采用之前的Fashion-MNIST数据集,在模型的输入层通道数从原来的3改为1,且最后一层输出长度从原来的1000修改为10。

python 复制代码
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))

下面展示了每一层输出的形状(B,C,H,W):

python 复制代码
X = torch.randn(1, 1, 224, 224)
for layer in net:
    X=layer(X)
    print(layer.__class__.__name__,'output shape:\t',X.shape)

3.2 模型训练

由于Fashion-MNIST数据集中的图像大小为28*28需要通过resize参数将其缩放为224*224的图像(只指定一个参数时为等比缩放)。

python 复制代码
batch_size = 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)
python 复制代码
lr, num_epochs = 0.01, 10
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

这次训练耗时较长,在我的电脑上使用RTX3050GPU训练耗时达到13分多,而上一章的LeNet训练只花费了一分钟左右。


参考文献

1\]《动手学深度学习》,https://zh-v2.d2l.ai/ \[2\] Alex Krizhevsky, Ilya Sutskever, and Geoffrey E. Hinton. 2017. ImageNet classification with deep convolutional neural networks. Commun. ACM 60, 6 (June 2017), 84--90. https://doi.org/10.1145/3065386

相关推荐
墩墩冰几秒前
计算机图形学 实现直线段的反走样
人工智能·机器学习
Pyeako5 分钟前
深度学习--卷积神经网络(下)
人工智能·python·深度学习·卷积神经网络·数据增强·保存最优模型·数据预处理dataset
OPEN-Source7 分钟前
大模型实战:搭建一张“看得懂”的大模型应用可观测看板
人工智能·python·langchain·rag·deepseek
zzz的学习笔记本10 分钟前
AI智能体时代的记忆 笔记(由大模型生成)
人工智能·智能体
AGI-四顾17 分钟前
文生图模型选型速览
人工智能·ai
大尚来也17 分钟前
一篇搞懂AI通识:用大白话讲清人工智能的核心逻辑
人工智能
Coder_Boy_18 分钟前
Deeplearning4j+ Spring Boot 电商用户复购预测案例
java·人工智能·spring boot·后端·spring
风指引着方向22 分钟前
动态形状算子支持:CANN ops-nn 的灵活推理方案
人工智能·深度学习·神经网络
weixin_3954489125 分钟前
cursor日志
人工智能·python·机器学习
凤希AI伴侣28 分钟前
你觉得,AI能让你“一人成军”吗?我的工具流与真实体验
人工智能·凤希ai伴侣