参考论文:ImageNet classification with deep convolutional neural networks作者:Alex Krizhevsky,Ilya Sutskever,Geoffrey E. Hinton(AI教父,2019图灵奖得主)
AlexNet是2012年ImageNet图像分类竞赛的冠军,首次将卷积神经网络CNN和深度学习用于大规模图像分类并且性能优异,在今天也具有一定的参考价值。
1、网络架构
这里原图中输入图像的大小应该为
227*227
,作者应该是笔误写成了224*224
$$ feature map尺寸=\frac{Input+2*padding-filter}{stride} +1 =\frac{227+2*0-11}{4}+1 =55 $$
设计成上图的结构是因为当时算力不够,也没什么好用的深度学习开源框架。他们手上只有两个GTX580的3GB内存的GPU,为了加快模型的训练速度,所以将模型分为两个部分。一个GPU训练上面的部分,另一个GPU训练下面的部分。
若在不改变模型结构的条件下,放在今天的软硬件条件下,AlexNet会被设计成如下结构:
图中的 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)
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).