AlexNet

出处:

《ImageNet Classification with Deep Convolutional Neural Networks》

AlexNet在2012年的ImageNet比赛上夺冠

背景:

之前目标检测和识别任务对数据量要求比较大,AlexNet共有五层卷积和三层全连接,实验中其表示网络深度会对网络性能产生影响。

网络结构:

五层卷积和三层全连接,输入维度是224*224*3

  • Conv1: num=96,kernel_size=11,stride=4,pad=0,224*224*3 —> 55*55*96
  • LRN局部响应归一化(Local Response Normalized)
  • Maxpooling,kernel_size=3, stride=2, pad=0,55*55*96 —> 27*27*96
  • Conv2: num=256,kernel_size=5,stride=1,pad=2,27*27*96 —> 27*27*256
  • LRN局部响应归一化(Local Response Normalized)
  • Maxpooling,kernel_size=3, stride=2, pad=0,27*27*256 —> 13*13*256
  • Conv3: num=384,kernel_size=3,stride=1,pad=1,13*13*256 —> 13*13*384
  • Conv4: num=384,kernel_size=3,stride=1,pad=1,13*13*384 —> 13*13*384
  • Conv5: num=256,kernel_size=3,stride=1,pad=1,13*13*384 —> 13*13*256
  • Maxpooling,kernel_size=3, stride=2, pad=0,13*13*256 —> 6*6*256
  • FC1: 6*6*256 —> 4096
  • FC2: 4096 —> 4096
  • FC3: 4096 —> 1000 —> softmax

特点:

  • 成功使用ReLU作为CNN的激活函数,并验证其效果在较深的网络超过了Sigmoid,成功解决了Sigmoid在网络较深时的梯度弥散问题。虽然ReLU激活函数在很久之前就被提出了,但是直到AlexNet的出现才将其发扬光大。
  • 训练时使用Dropout随机忽略一部分神经元,以避免模型过拟合。Dropout虽有单独的论文论述,但是AlexNet将其实用化,通过实践证实了它的效果。在AlexNet中主要是最后几个全连接层使用了Dropout
  • CNN中使用重叠的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。并且AlexNet中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性
  • 提出了LRN,对局部神经元的活动创建竞争机制,使得其中响应比较大值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力

结果 = 当前位置 / (前n/2和后n/2通道对应位置的平方和)

### AlexNet 深度学习模型使用指南与代码实现 #### 一、AlexNet 的背景介绍 AlexNet 是由 Alex Krizhevsky 提出的一种卷积神经网络,在 ImageNet LSVRC-2010 比赛中取得了显著的成绩并远超第二名,这标志着深度学习在图像分类领域的突破性进展[^3]。它的成功不仅验证了深度学习提取特征的能力优于传统手工设计的方法,还推动了后续一系列 CNN 架构的研究与发展。 #### 二、AlexNet 的主要特点 以下是 AlexNet 的几个核心特性及其优势: 1. **ReLU 激活函数** ReLU (Rectified Linear Unit) 被用于激活隐藏单元,相比传统的 Sigmoid 和 Tanh 函数,ReLU 不会遇到梯度消失问题,并能加速训练过程中的收敛速度[^3]。 2. **数据增强技术** AlexNet 利用了多种数据增强手段来扩充训练集规模,例如随机裁剪、水平翻转以及颜色变换等操作。这些方法有效提升了模型的泛化能力,降低了过拟合风险[^1]。 3. **Dropout 技术的应用** Dropout 方法被引入到全连接层部分以减少过拟合现象的发生。通过随机丢弃一部分神经元的方式增加模型鲁棒性和防止参数间过度依赖关系形成[^1]。 4. **多GPU 并行计算支持** 原始版本实现了跨两个 NVIDIA GTX 580 GPUs 上分布式运行的设计理念,从而大幅缩短了整体训练时间成本。 #### 三、AlexNet 完整代码实现 下面提供了一个基于 PyTorch 实现的标准 AlexNet 结构: ```python import torch.nn as nn import torch.optim as optim class AlexNet(nn.Module): def __init__(self, num_classes=1000): # 默认设置为ImageNet类别数量 super(AlexNet, self).__init__() self.features = nn.Sequential( nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=2), # 输入通道数设为3(RGB图片) nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2) ) self.classifier = nn.Sequential( nn.Dropout(), nn.Linear(256 * 6 * 6, 4096), nn.ReLU(inplace=True), nn.Dropout(), nn.Linear(4096, 4096), nn.ReLU(inplace=True), nn.Linear(4096, num_classes) ) def forward(self, x): x = self.features(x) x = x.view(-1, 256 * 6 * 6) # 展平处理 x = self.classifier(x) return x # 创建实例对象 model = AlexNet() criterion = nn.CrossEntropyLoss() # 设置损失函数交叉熵误差适合多类别的分类任务 optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9) # 使用SGD优化器配置初始学习率和动量项系数 ``` 以上展示了如何构建一个基本版次的Pytorch框架下的alexnet架构定义文件;当然实际项目开发当中还需要考虑更多细节比如加载预训练权重或者调整输入尺寸适应不同分辨率需求等问题。 #### 四、注意事项 当尝试复刻或改进该算法时需要注意以下几点事项: - 数据准备阶段应严格按照官方描述执行相应的前处理步骤; - 如果硬件资源有限,则可能需要降低batch size大小或是简化原结构复杂程度以便顺利完成整个流程运转工作; - 训练过程中密切关注loss变化趋势曲线图以及其他评估指标表现情况及时作出相应策略调整决策。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值