首先贴出三个链接:
2. 使用pytorch搭建AlexNet并针对花分类数据集进行训练
3. 使用tensorflow搭建AlexNet并针对花分类数据集进行训练
AlexNet是2012年ILSVRC 2012(ImageNet Large Scale Visual Recognition Challenge)竞赛的冠军网络,分类准确率由传统方法的 70%+提升到 80%+(当时传统方法已经进入瓶颈期,所以这么大的提升是非常厉害的)。它是由Hinton和他的学生Alex Krizhevsky设计的。也是在那年之后,深度学习开始迅速发展。下图是从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文件夹中.