AlexNet架构解析

61 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第1天

参考论文:ImageNet classification with deep convolutional neural networks

作者:Alex KrizhevskyIlya SutskeverGeoffrey E. Hinton(AI教父,2019图灵奖得主)

  AlexNet是2012年ImageNet图像分类竞赛的冠军,首次将卷积神经网络CNN和深度学习用于大规模图像分类并且性能优异,在今天也具有一定的参考价值。

1、网络架构

image-20220811205059678

这里原图中输入图像的大小应该为227*227,作者应该是笔误写成了224*224

featuremap尺寸=Input+2paddingfilterstride+1=227+20114+1=55feature map尺寸=\frac{Input+2*padding-filter}{stride} +1 =\frac{227+2*0-11}{4}+1 =55

  设计成上图的结构是因为当时算力不够,也没什么好用的深度学习开源框架。他们手上只有两个GTX580的3GB内存的GPU,为了加快模型的训练速度,所以将模型分为两个部分。一个GPU训练上面的部分,另一个GPU训练下面的部分。

  若在不改变模型结构的条件下,放在今天的软硬件条件下,AlexNet会被设计成如下结构:

image-20220811205605423

  图中的 s 表示 stride,代表步长,s1 代表卷积或池化的步长为 1,s2 代表卷积或池化的 步长为 2,以此类推;fc 表示 fully connected,代表全连接;pool 表示 max pooling,代 表最大池化;conv 表示 convolution,代表卷积;output 表示输出。

  AlexNet 是一个 8 层的网络(卷积层和全连接层中有需要训练的权值,所以这里计算网 络层数的时候只计算卷积层和全连接层),除了最后输出层用的是 softmax 函数以外,其他 层用的都是 ReLU 激活函数。

  AlexNet 是专门为 ImageNet 级别的数据集设计的,一共有 6000 多万个需要训练的参数,参数的数量巨大。

2、计算过程

  第 1 层计算。网络的输入是 227×227 的彩色照片。经过 11×11 步长为 4 的卷积 计算后,得到 96 个 55×55 的特征图。然后再进行 3×3 步长为 2 的最大池化计算,得到 96 个 27×27 的特征图。

  第 2 层计算。使用 5×5,步长为 1 的卷积对 96 个 27×27 的特征图进行特征提取,得到了 256 个 27×27 的特征图。然后再用 3×3 步长为 2 的最大池化计算,得到 256 个 13× 13 的特征图。

  第 3 层计算。使用 3×3,步长为 1 的卷积对 256 个 13×13 的特征图进行特征提取,得到了 384 个 13×13 的特征图。

  第 4 层计算。使用 3×3,步长为 1 的卷积对 384 个 13×13 的特征图进行特征提取,得到了 384 个 13×13 的特征图。

  第 5 层计算。使用 3×3,步长为 1 的卷积对 384 个 13×13 的特征图进行特征提取,得到了 256 个 13×13 的特征图。然后再用 3×3 步长为 2 的最大池化计算,得到 256 个 6×6 的特征图。

  第 6 层计算。把 pool3 的 256 个 6×6 的特征图数据跟 fc1 中的 4096 个神经元进行全连接计算。

  第 7 层计算。把 fc2 的 4096 个神经元跟 fc1 中的 4096 个神经元进行全连接计算。

  第 8 层计算。把 output 的 1000(ImageNet Challenge 比赛有 1000 个分类)个神经元跟 fc2 中的 4096 个神经元进行全连接计算。最后再经过 softmax 计算得到类别的概率值进行输出。

3、AlexNet模型复现

这里使用tensorflow框架对AlexNet架构进行复现

import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import *
from plot_model import plot_model

image_size=227
channel=3
num_classes=1000

inputs=Input(shape=(image_size,image_size,channel))
x=Conv2D(filters=96,kernel_size=(11,11),strides=(4,4),padding='valid',
         activation='relu')(input)
x=MaxPool2D(pool_size=(3,3),strides=(2,2),padding='valid')(x)
x=Conv2D(filters=256,kernel_size=(5,5),strides=(1,1),padding='same',
         activation='relu')(x)
x=MaxPool2D(pool_size=(3,3),strides=(2,2),padding='valid')(x)
x=Conv2D(filters=384,kernel_size=(3,3),strides=(1,1),padding='same',
         activation='relu')(x)
x=Conv2D(filters=384,kernel_size=(3,3),strides=(1,1),padding='same',
         activation='relu')(x)
x=Conv2D(filters=256,kernel_size=(3,3),strides=(1,1),padding='same',
         activation='relu')(x)
x=MaxPool2D(pool_size=(3,3),strides=(2,2),padding='valid')(x)
x=Flatten()(x)
x=Dense(4096,activation='relu')(x)
x=Dropout(0.5)(x)
x=Dense(4096,activation='relu')(x)
x=Dropout(0.5)(x)
x=Dense(num_classes,activation='softmax')(x)
model=Model(inputs=inputs,outputs=x)
model.summary()
plot_model(model,to_file='img/AlexNet.png',show_shapes=True)

image-20220811210158569

image-20220811210209416

References

[1] Krizhevsky A , Sutskever I , Hinton G . ImageNet Classification with Deep Convolutional Neural Networks[J]. Advances in neural information processing systems, 2012, 25(2).