AlexNet网络结构详解与模型的搭建

时间:2024-03-31 13:49:06

首先贴出三个链接:

1. AlexNet网络结构详解视频

2. 使用pytorch搭建AlexNet并针对花分类数据集进行训练

3. 使用tensorflow搭建AlexNet并针对花分类数据集进行训练

 

AlexNet是2012年ILSVRC 2012(ImageNet Large Scale Visual Recognition Challenge)竞赛的冠军网络,分类准确率由传统方法的 70%+提升到 80%+(当时传统方法已经进入瓶颈期,所以这么大的提升是非常厉害的)。它是由Hinton和他的学生Alex Krizhevsky设计的。也是在那年之后,深度学习开始迅速发展。下图是从AlexNet原论文中截取的网络结构图。

AlexNet网络结构详解与模型的搭建

在图中有上下两个部分是因为作者使用两块GPU进行并行训练,所以上下两个部分结构是一模一样的,我们直接看下面部分就行了。接下来说说该网络的亮点:

(1)首次利用 GPU 进行网络加速训练。

(2)使用了 ReLU **函数,而不是传统的 Sigmoid **函数以及 Tanh **函数。

(3)使用了 LRN 局部响应归一化。

(4)在全连接层的前两层中使用了 Dropout方法按一定比例随机失活神经元,以减少过拟合。

 

接着给出经卷积或池化后的矩阵尺寸大小计算公式:

 N = (W − F + 2P ) / S + 1

其中W是输入图片大小,F是卷积核或池化核的大小, P是padding的像素个数 ,S是步距

 

接下来我们对网络的每一层进行详细的分析:

卷积层1(由于使用了2块GPU,所以卷积核的个数需要乘以2):

Conv1: kernels:48*2=96;kernel_size:11;padding:[1, 2] ;stride:4

其中kernels代表卷积核的个数,kernel_size代表卷积的尺寸,padding代表特征矩阵上下左右补零的参数,stride代表步距

输入的图像shape: [224, 224, 3], 输出特征矩阵的shape: [55, 55, 96]

shape计算:N = (W − F + 2P ) / S + 1 = [ 224 - 11 + (1 + 2)] / 4 + 1 = 55

 

最大池化下采样层1

Maxpool1: kernel_size:3;pading: 0;stride:2

其中kernel_size是池化核大小,padding代表特征矩阵上下左右补零的参数,stride代表步距

输入特征矩阵的shape: [55, 55, 96], 输出特征矩阵的shape: [27, 27, 96]

shape计算:N = (W − F + 2P ) / S + 1 = (55 - 3) / 2 + 1 = 27

 

卷积层2

Conv2: kernels:128*2=256; kernel_size:5; padding: [2, 2]; stride:1

输入特征矩阵的shape:[27, 27, 96], 输出特征矩阵的shape: [27, 27, 256]

shape计算:N = (W − F + 2P ) / S + 1 = (27 - 5 + 4) / 1 + 1 = 27

 

最大池化下采样层2

Maxpool2: kernel_size:3; pading: 0; stride:2

输入特征矩阵的shape:  [27, 27, 256],输出特征矩阵的shape: [13, 13, 256]

shape计算:N = (W − F + 2P ) / S + 1 = (27 - 3) / 2 + 1 = 13

 

卷积层3

Conv3: kernels:192*2=384; kernel_size:3; padding: [1, 1]; stride:1

输入特征矩阵shape:[13, 13, 256], 输出特征矩阵shape: [13, 13, 384]

shape计算:N = (W − F + 2P ) / S + 1 = (13 - 3 + 2) / 1 + 1 = 13

 

卷积层4

Conv4: kernels:192*2=384; kernel_size:3; padding: [1, 1]; stride:1

输入特征矩阵shape:[13, 13, 384], 输出特征矩阵shape: [13, 13, 384]

shape计算:N = (W − F + 2P ) / S + 1 = (13 - 3 + 2) / 1 + 1 = 13

 

卷积层5

Conv5: kernels:128*2=256; kernel_size:3; padding: [1, 1]; stride:1

输入特征矩阵shape:[13, 13, 384],输出特征矩阵shape: [13, 13, 256]

shape计算:N = (W − F + 2P ) / S + 1 = (13 - 3 + 2) / 1 + 1 = 13

 

最大池化下采样层3

Maxpool3: kernel_size:3 padding: 0 stride:2

输入特征矩阵shape:[13, 13, 256] ,输出特征矩阵shape: [6, 6, 256]

shape计算:N = (W − F + 2P ) / S + 1 = (13 - 3) / 2 + 1 = 6

 

全连接层1

unit_size: 2048 (unit_size为全连接层节点个数)

 

全连接层2

unit_size: 2048

 

全连接层3

unit_size: 1000(该层为输出层,输出节点个数对应你分类任务的类别个数)

 

最后给出所有层参数的总表:

layer_name

kernel_size

kernel_num

padding

stride

Conv1

11

96

[1, 2]

4

Maxpool1

3

None

0

2

Conv2

5

256

[2, 2]

1

Maxpool2

3

None

0

2

Conv3

3

384

[1, 1]

1

Conv4

3

384

[1, 1]

1

Conv5

3

256

[1, 1]

1

Maxpool3

3

None

0

2

FC1

2048

None

None

None

FC2

2048

None

None

None

FC3

1000

None

None

None

关于模型的搭建与训练代码放在我的github中,大家可自行下载使用:

https://github.com/WZMIAOMIAO/deep-learning-for-image-processing

pytorch版本在pytorch_learning文件夹中,tensorflow版本在tensorflow_learning文件夹中.