在卷积神经网络学习(一)中,笔者基于LeNet模型简单介绍了ConNet的基本构成(卷积层、池化层、全连接层等),该模型对手写数字的识别具有较高的准确率,但对于大规模的图像分类还远远不够。而本文即将介绍的AlexNet模型,,由Alex Krizhevsky等人设计,在ILSVRC-2012中以15.3%的top-5错误率获得第一名,比第二名的错误率要低10.9%。这里附上AlexNet模型的文章以及一系列deep learning文章的链接:Deep Learning Papers Reading Roadmap
ps: 本文的图片和内容主要来自Alex的论文
模型结构
这里为节省时间,模型参数介绍直接引用斯坦福CS231n的PPT图片:
可以很直观的看出,AlexNet一共有5个卷积层,其中有三个卷积层后接了最大池化层,最后是三个全连接层。需要说明的是,论文中说该模型的输入图片的维度是224*224*3, 但实际上输入应该是227*227*3,这样在CONV1层的参数才能说得通,换句话说,CONV1层中的输出特征图的维度为(227+0*2-11)/4+1=55。
模型特点
数据扩充(Data Augmentation)
在训练过程中,数据量的大小对于训练结果至关重要,在AlexNet模型通过使用多种图像变换方式以扩充原始数据集,从而缓解过拟合现象。
第一种方式是平移变换和反射变换。根据论文中的介绍,在训练阶段,先随机从256*256的图像中随机抽取224*224的碎片,将原来的数据量扩充了2048倍;在测试阶段,该网络通过提取五个224×224的碎片(四个边角碎片和中心碎片)连同它们的水平反射(因此总共是十个碎片)做出了预测,并在这十个碎片上来平均该网络的softmax层做出的预测。
第二种方式是彩色变换。通过改变训练图像中RGB通道的强度,用的是PCA方法扩充数据。
ReLU激活函数(Rectified Linear Units)
AlexNet用ReLU即
f(x)=max(0,x)
来代替激活函数
f(x)=tanh(x)
和
f(x)=(1+e−x)−1
,有效提高了模型训练的收敛速度。以下实从论文中截取的一个对比图,反映的是分别用ReLU激活函数和用tanh激活函数在训练CIFAR10的训练误差收敛速度。
多GPU(Multiple GPUs)
由于当时GPU运算能力有限,Alex采用了两个GTX580进行训练,这也是为什么最开始的模型结构分成了上下两层。
局部标准化(Local Response Normalization)
AlexNet在卷积中引入局部标准化,据论文介绍,改方法的引入在CIFAR10数据集上降低了约2%的测试误差。不过该方法在之后并不常用。这里不多介绍,可以看论文中介绍。
重叠池化 (Overlapping Pooling)
当池化操作中步长小于核的大小,相邻的池化就会发生重叠,据文中介绍,重叠池化比不重叠池化更不易出现过拟合。
Dropout
Dropout原理类似于浅层学习算法的中集成算法,该方法通过让全连接层的神经元(该模型在前两个全连接层引入Dropout)以一定的概率失去活性(比如0.5)失活的神经元不宰参与前向和反向传播,相当于约有一半的神经元不再起作用。在测试的时候,让所有神经元的输出乘0.5。Dropout的引用,有效缓解了模型的过拟合。