图像分类篇:pytorch实现AlexNet

AlexNet详解

AlexNet是2012年ILSVRC 2012(ImageNet Large Scale Visual Recognition Challenge)竞赛的冠军网络,分类准确率由传统方法的 70%+提升到 80%+(当时传统方法已经进入瓶颈期,所以这么大的提升是非常厉害的)。它是由Hinton和他的学生Alex Krizhevsky设计的。也是在那年之后,深度学习开始迅速发展。AlexNet包括5个卷积层、3个池化层和3个全连接层,其网络结构图如下图所示。

图像分类篇:pytorch实现AlexNet_第1张图片

 更细节化的网络结构图:

图像分类篇:pytorch实现AlexNet_第2张图片

该网络的亮点在于:
  • 首次利用GPU进行网络加速训练;
  • 使用了ReLU激活函数,而不是传统的Sigmoid激活函数以及Tanh激活函数;其优势在于收敛速度更快,使得训练时间更短, 已成为卷积神经网络最常用的激活函数。1)克服梯度消失的问题;2)加快训练速度。

Relu函数:f(x)=max(0,x)

图像分类篇:pytorch实现AlexNet_第3张图片

  • 使用了LRN(Local Response Normalization)局部响应归一化;LRN模拟神经生物学上一个叫做侧抑制(lateral inhibitio)的功能,侧抑制指的是被激活的神经元会抑制相邻的神经元。LRN局部响应归一化借鉴侧抑制的思想实现局部抑制,使得响应比较大的值相对更大,提高了模型的泛化能力。LRN只对数据相邻区域做归一化处理,不改变数据的大小和维度。
  • 在全连接层的前两层中训练时使用Dropout随机忽略一部分神经元,以避免模型过拟合。dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率(AlexNet是50%,这种情况下随机生成的网络结构最多)将其暂时从网络中丢弃(保留其权值),不再对前向和反向传输的数据响应。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而相当于每一个mini-batch都在训练不同的网络,drop out可以有效防止模型过拟合,让网络泛化能力更强,同时由于减少了网络复杂度,加快了运算速度。还有一种观点认为drop out有效的原因是对样本增加来噪声,变相增加了训练样本。

 使用Dropout的方式在网络正向传播过程中随机失活一部分神经元。

图像分类篇:pytorch实现AlexNet_第4张图片

 过拟合:

根本原因是特征维度过多,模型假设过于复杂,参数过多,训练数据过少,噪声过多,导致拟合的函数完美的预测训练集,但对新数据的测试集预测结果差。过度拟合了训练数据,而没有考虑到泛化能力。

图像分类篇:pytorch实现AlexNet_第5张图片

  经卷积后的矩阵尺寸大小计算公式为:

N=\frac{W-F+2P}{S}+1

  • 输入图片大小WxW
  • Filter大小FxF
  • 步长S
  • padding的像素数P

Conv1阶段

图像分类篇:pytorch实现AlexNet_第6张图片

  • 输入:input_size=[224,224,3]
  • 卷积层:
  • kernels=48*2=96组卷积核
  • kernel_size=11
  • padding=[1,2](表示在特征矩阵的左边加上1列0,右边加上2列0,上边加上1行0,下边加上2行0)
  • stride=4
  • 输出:output_size=[55,55,96]

经过Conv1卷积后的输出层尺寸为:

Output=\frac{W-F+2P}{S}+1=\frac{224-11+(1+2)}{4}+1=55

Maxpool1

图像分类篇:pytorch实现AlexNet_第7张图片

  • 输入:input_size=[55,55,96]
  • 池化层:(只改变尺寸,不改变深度)
  • kernel_size=3
  • padding=0
  • stride=2
  • 输出:output_size=[27,27,96]

conv2 阶段

图像分类篇:pytorch实现AlexNet_第8张图片

  • 输入:input_size=[27,27,96]
  • 卷积层:
  • kernels=128*2=256组卷积核
  • kernel_size=5
  • padding=[2,2] 
  • stride=1
  • 输出:output_size=[27,27,256]

经过Conv1卷积后的输出层尺寸为:

Output=\frac{W-F+2P}{S}+1=\frac{224-11+(1+2)}{4}+1=55

Maxpool2

图像分类篇:pytorch实现AlexNet_第9张图片

  • 输入:input_size=[27,27,256]
  • 池化层:(只改变尺寸,不改变深度)
  • kernel_size=3
  • padding=0
  • stride=2
  • 输出:output_size=[13,13,256]

 Conv3阶段

图像分类篇:pytorch实现AlexNet_第10张图片

  • 输入:input_size=[13,13,256]
  • 卷积层:
  • kernels=192*2=384组卷积核
  • kernel_size=3
  • padding=[1,1]
  • stride=1
  • 输出:output_size=[13,13,384]

 Conv4阶段

图像分类篇:pytorch实现AlexNet_第11张图片

  • 输入:input_size=[13,13,384]
  • 卷积层:
  • kernels=192*2=384组卷积核
  • kernel_size=3
  • padding=[1,1](表示左上
  • stride=1
  • 输出:output_size=[13,13,384]

 Conv5阶段

图像分类篇:pytorch实现AlexNet_第12张图片

  • 输入:input_size=[13,13,384]
  • 卷积层:
  • kernels=128*2=256组卷积核
  • kernel_size=3
  • padding=[1,1](表示左上
  • stride=1
  • 输出:output_size=[13,13,256]

 Maxpool3

图像分类篇:pytorch实现AlexNet_第13张图片

  • 输入:input_size=[13,13,256]
  • 池化层:(只改变尺寸,不改变深度)
  • kernel_size=3
  • padding=0
  • stride=2
  • 输出:output_size=[6,6,256]

FC1、FC2、FC3

Maxpool3 → (6*6*256) → FC1 → 2048 → FC2 → 2048 → FC3 → 1000
最终的1000可以根据数据集的类别数进行修改。AlexNet在FC1全连接层引入了drop out的功能。dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率(一般是50%,这种情况下随机生成的网络结构最多)将其暂时从网络中丢弃(保留其权值),不再对前向和反向传输的数据响应。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而相当于每一个mini-batch都在训练不同的网络,drop out可以有效防止模型过拟合,让网络泛化能力更强,同时由于减少了网络复杂度,加快了运算速度。                               

总结

整体来看,AlexNet的卷积核从11到5再到3不断变小,而feature map也通过重叠式max pool在第1、2、5层折半式缩小,到第5个卷积层后,图像特征已经提炼得足够充分,便用两个全连接层和一个softmax层组合得出最终的分类结果。

 分析可以发现,除 Conv1 外,AlexNet 的其余卷积层都是在改变特征矩阵的深度,而池化层则只改变(减小)其尺寸。

数据集介绍

花分类数据集,包含 5 中类型的花,每种类型有600~900张图像不等。

在这里插入图片描述

训练截图:

图像分类篇:pytorch实现AlexNet_第14张图片

测试结果:

图像分类篇:pytorch实现AlexNet_第15张图片

 参考博文:pytorch图像分类篇:3.搭建AlexNet并训练花分类数据集

你可能感兴趣的:(p2p,linq,wpf)