1、AlexNet
1.1 基本介绍
AlexNet是由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton在2012年ImageNet大规模视觉识别挑战赛(ILSVRC)中提出的,它不仅赢得了当届的比赛,还激发了后续许多创新的神经网络架构(如VGGNet、ResNet、GoogLeNet等)的开发
1.2 网络结构
AlexNet网络结构包括以下几个关键层:
- 卷积层(Convolutional Layer):使用多个卷积核提取图像特征
- 池化层(Pooling Layer):通常使用最大池化(Max Pooling)或平均池化(Average Pooling)来降低特征图的空间维度
- 全连接层(Fully Connected Layer):将特征展平铺并连接到输出层进行分类
AlexNet的具体网络结构如下:
-
输入层:224x224像素的RGB三通道彩色图像
-
第一层卷积:使用96个11x11的卷积核,步长为4,边缘填充数为2,输出96x55x55的特征图【(224 + 2*2 - 11) / 4 + 1 = 55】(备注:由于是两个GPU一起跑,所以图中显示的是两个48x55x55)
-
第一层池化:3x3的最大池化,步长为2,边缘填充数为0,输出48x27x27的特征图【(55 + 2*0 - 3) / 2 + 1 = 27】(备注:同上,是两个48x27x27)
-
第二层卷积:使用256个5x5的卷积核,步长为1,边缘填充数为2,输出128x27x27的特征图【(27 + 2*2 - 5) / 1 + 1 = 27】(备注:同上,是两个128x27x27)
-
第二层池化:3x3的最大池化,步长为2,边缘填充数为0,输出128x13x13的特征图【(27 + 2*0 - 3) / 2 + 1 = 13】(备注:同上,是两个128x13x13)
-
第三层卷积:使用384个3x3的卷积核,步长为1,边缘填充数为1,输出192x13x13的特征图【(13 + 2*1 - 3) / 1 + 1 = 13】(备注:同上,是两个192x13x13)
-
第四层卷积:使用384个3x3的卷积核,步长为1,边缘填充数为1,输出192x13x13的特征图【(13 + 2*1 - 3) / 1 + 1 = 13】(备注:同上,是两个192x13x13)
-
第五层卷积:使用256个3x3的卷积核,步长为1,边缘填充数为1,输出128x13x13的特征图【(13 + 2*1 - 3) / 1 + 1 = 13】(备注:同上,是两个128x13x13)
-
第五层池化:3x3的最大池化,步长为2,边缘填充数为0,输出128x6x6的特征图【(13 + 2*0 - 3) / 2 + 1 = 6】(备注:同上,是两个128x6x6)
-
第一全连接层:将两个128x6x6的特征图展平,连接到两个2048维向量
-
第二全连接层:两个2048维全连接到两个2048维向量(每个全连接层都可以看作是在进行特征组合,即使神经元的数量相同,第二个全连接层的每个神经元也都会是前一个全连接层所有神经元的加权和,这样的设计允许网络在更高层次上组合和抽象特征)
-
第三全连接层:两个2048维全连接到1000维,代表1000个类别
1.3 创新点
- ReLU激活函数:AlexNet是第一个在每一层卷积层之后使用ReLU激活函数的网络,与sigmoid激活函数不同,ReLU不会导致梯度消失问题,并且能加快训练速度
- Dropout正则化:为了减少过拟合,AlexNet在全连接层之间引入了Dropout技术,随机丢弃一部分神经元,以减少神经元之间的依赖关系
- 数据增强和多GPU训练:为了提高模型的鲁棒性和泛化能力,AlexNet使用了数据增强技术,并使用了两个GPU进行并行计算以加速训练
1.4 网络搭建
# 引入pytorch和nn神经网络
import torch
import torch.nn as nn
class AlexNet(nn.Module):
"""
自定义一个AlexNet神经网络
"""
def __init__(self, in_channels=3, n_classes=1000):
"""
初始化
"""
super().__init__()
# 1. 特征抽取
self.feature_extractor = nn.Sequential(
# 第一层卷积
nn.Conv2d(
in_channels=in_channels,
out_channels=96,
kernel_size=11,
stride=4,
padding=2
),
nn.ReLU(inplace=True),
# 第一层池化
nn.MaxPool2d(
kernel_size=3,
stride=