Alex_McAvoy

想要成为渔夫的猎手

经典卷积神经网络之 AlexNet

References:

【概述】

2012 年,Alex Krizhevsky、Ilya Sutskever 设计出了一个深层的卷积神经网络 AlexNet,夺得了2012年 ImageNet LSVRC 的冠军,且准确率远超第二名(top5 错误率为 $15.3\%$,第二名为 $26.2\%$),引起了很大的轰动,可以说是具有历史意义的一个网络结构

AlexNet 取得成功的原因是其使网络的宽度和深度达到了前所未有的高度,而整个网络的可学参数达到了 $58,322,314$ 个,为了学习该网络,AlexNet 并行使用了两块 GTX 580,大幅提升了训练速度

【贡献】

相较于 LeNet,AlexNet 除加大网络的宽度和深度外,还做了如下创新:

  1. 数据增强(Data Augmentation):采用镜像反射和随机剪裁、改变样本 RGB 通道的强度值两种数据增强方法
  2. ReLU 激活函数:使用 ReLU 激活函数来代替 LeNet-5 中的 Sigmoid 和 Tanh 激活函数,有效缓解梯度消失问题,同时优化网络的性能,一定程度上缓解过拟合
  3. 局部响应归一化(Local Response Normalization,LRN):首次引入的归一化方法,模拟了动物神经中的横向抑制效应,在批量归一化出现后,该方法已不再使用
  4. 随机失活(Dropout):在 AlexNet 的全连接层 FC6、FC7,使用 Dropout 来减轻容量高的模型容易发生过拟合的现象
  5. 最大池化(Max Pooling):在之前的 CNN 普遍使用平均池化,而 AlexNet 全部使用最大池化,避免了平均池化层的模糊化效果
  6. 重叠池化(Overlap Pooling):在进行最大池化时,令步长小于池化窗口,使得相邻的池化窗口存在覆盖的单元,提高特征多样性,一定程度上减缓了过拟合
  7. 多 GPU 训练:AlexNet 将网络分成两个部分,使用两块 GPU 多卡训练
  8. 端到端训练:使用端到端训练,除将每个像素中减去训练集的像素均值之外,没有以任何其他方式对图像进行预处理,直接使用像素的 RGB 值训练网络

【网络结构】

AlexNet 的网络结构如下图,其由 $5$ 个卷积层与 $3$ 个全连接层构成

参数形状如下表:

【实现】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import torch.nn as nn

class AlexNet(nn.Module):
def __init__(self):
super(AlexNet, self).__init__()
self.conv = nn.Sequential(
# in_channels, out_channels, kernel_size, stride, padding
nn.Conv2d(1, 96, 11, 4),
nn.ReLU(),
# kernel_size, stride
nn.MaxPool2d(3, 2),
# 减小卷积窗口,且填充2层来使输入、输出的高和宽一致,同时增大输出通道数
nn.Conv2d(96, 256, 5, 1, 2),
nn.ReLU(),
nn.MaxPool2d(3, 2),
# 连续3个使用更小卷积窗口的卷积层,且除最后一层外,进一步增大输出通道数
nn.Conv2d(256, 384, 3, 1, 1),
nn.ReLU(),
nn.Conv2d(384, 384, 3, 1, 1),
nn.ReLU(),
nn.Conv2d(384, 256, 3, 1, 1),
nn.ReLU(),
nn.MaxPool2d(3, 2)
)
self.fc = nn.Sequential(
nn.Linear(256*5*5, 4096),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(4096, 4096),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(4096, 10),
)

def forward(self, img):
feature = self.conv(img)
output = self.fc(feature.view(img.shape[0], -1))
return output
感谢您对我的支持,让我继续努力分享有用的技术与知识点!