📜  毫升 | AlexNet 入门

📅  最后修改于: 2022-05-13 01:54:22.154000             🧑  作者: Mango

毫升 | AlexNet 入门

本文的重点是介绍 AlexNet 架构。它的名字来自 AlexNet 论文的主要作者之一——Alex Krizhevsky。它以15.3%的错误率前 5 名赢得了 ImageNet 大规模视觉识别挑战赛 (ILSVRC) 2012(击败了错误率26.2%的前 5 名的亚军)。

AlexNet 论文最重要的特点是:

  • 由于该模型必须训练6000 万个参数(数量相当多),因此很容易出现过拟合。根据该论文,Dropout 和数据增强的使用显着有助于减少过度拟合。因此,架构中的第一个和第二个全连接层为此使用了0.5的 dropout。通过数据增强人为地增加图像数量有助于在运行时动态扩展数据集,从而帮助模型更好地泛化。
  • 另一个明显的因素是使用 ReLU 激活函数而不是 tanh 或 sigmoid,这导致了更快的训练时间(训练时间减少了6 倍)。深度学习网络通常使用 ReLU 非线性来实现更快的训练时间,因为其他网络在达到更高的激活值时开始饱和。

架构

该架构由 5 个卷积层组成,第 1、第 2 和第 5 层具有 Max-Pooling 层,用于正确提取特征。 Max-Pooling 层重叠,步长为2 ,滤波器大小为3×3 。与非重叠的 Max-Pooling 层相比,这导致top-1 和 top-5错误率分别降低了0.4%0.3% 。它们之后是2 个全连接层(每个都有 dropout)和一个用于预测的 softmax 层。

下图显示了 AlexNet 的架构,其中定义了所有层。

代码:实现对象分类的 AlexNet 的Python代码

model = Sequential()
  
# 1st Convolutional Layer
model.add(Conv2D(filters = 96, input_shape = (224, 224, 3), 
            kernel_size = (11, 11), strides = (4, 4), 
            padding = 'valid'))
model.add(Activation('relu'))
# Max-Pooling 
model.add(MaxPooling2D(pool_size = (2, 2),
            strides = (2, 2), padding = 'valid'))
# Batch Normalisation
model.add(BatchNormalization())
  
# 2nd Convolutional Layer
model.add(Conv2D(filters = 256, kernel_size = (11, 11), 
            strides = (1, 1), padding = 'valid'))
model.add(Activation('relu'))
# Max-Pooling
model.add(MaxPooling2D(pool_size = (2, 2), strides = (2, 2), 
            padding = 'valid'))
# Batch Normalisation
model.add(BatchNormalization())
  
# 3rd Convolutional Layer
model.add(Conv2D(filters = 384, kernel_size = (3, 3), 
            strides = (1, 1), padding = 'valid'))
model.add(Activation('relu'))
# Batch Normalisation
model.add(BatchNormalization())
  
# 4th Convolutional Layer
model.add(Conv2D(filters = 384, kernel_size = (3, 3), 
            strides = (1, 1), padding = 'valid'))
model.add(Activation('relu'))
# Batch Normalisation
model.add(BatchNormalization())
  
# 5th Convolutional Layer
model.add(Conv2D(filters = 256, kernel_size = (3, 3), 
            strides = (1, 1), padding = 'valid'))
model.add(Activation('relu'))
# Max-Pooling
model.add(MaxPooling2D(pool_size = (2, 2), strides = (2, 2), 
            padding = 'valid'))
# Batch Normalisation
model.add(BatchNormalization())
  
# Flattening
model.add(Flatten())
  
# 1st Dense Layer
model.add(Dense(4096, input_shape = (224*224*3, )))
model.add(Activation('relu'))
# Add Dropout to prevent overfitting
model.add(Dropout(0.4))
# Batch Normalisation
model.add(BatchNormalization())
  
# 2nd Dense Layer
model.add(Dense(4096))
model.add(Activation('relu'))
# Add Dropout
model.add(Dropout(0.4))
# Batch Normalisation
model.add(BatchNormalization())
  
# Output Softmax Layer
model.add(Dense(num_classes))
model.add(Activation('softmax'))