introduction
AlexNet是在2012年被发表的一个经典之作,并在当年取得了lmageNet最好成绩。论文全称为《ImageNet Classification with Deep Convolutional Neural Network》,从论文名字可以看出此网络主要用于图像分类任务,为什么叫它
AlexNet网络,因为论文第一作者为Alex Krizhevsky,因此命名为AlexNet。
注意:AlexNet为经典中的经典,虽然现在用的比较少但是里边用到的一些网络训练技巧,及防过拟合技巧现在一直在使用,所以非常有必要学习。
一、研究背景
AlexNet出现的两个重要条件:
- LabelMe,ImageNet等大的标注数据集的出现
- 硬件计算能力的提升(算力比较强的GPU等)
神经网络的火爆离不开两个重要的条件,一个是大量的数据,另一个是高性能的硬件。数据不够大,会存在过拟合的问题,由于神经网络包含大量的权重参数,算力不够强,训练速度慢。
图像分类问题简介(CNN)
-
图像物体分类
是计算机视觉中非常重要的基本问题,也是图像分割、物体跟踪、行为分析等其他高层视觉任务的基础。
-
深度学习分类两个阶段
- 第一阶段:训练阶段
- 第二阶段:测试阶段
图像分类应用(The application of images classification)活跃领域:
- 计算机视觉、模式识别与机器学习领域等
应用领域:
- 安防领域的人脸识别、行人检测、智能视频分析、行人跟踪等,交通领域的交通场景物体识别、车辆计数、逆行检测、车牌检测与识别,以及互联网领域的基于内容的图像检索、相册自动归类等。
图像分类发展历史
趋势:让机器更“自主”地学习如何对图像进行分类。
小知识点补充
机器学习特征
- 花萼宽度x 花薯长度y 花瓣长度m 花瓣宽度n
深度学习的特征
- 比较抽象难以解释
基于图像分类的神经网络
二、论文整体框架
论文结构:
摘要
我们训练了一个大型深度卷积神经网络来将ImageNet LSVRC-2010竞赛的120万高分辨率的图像分到1000不同的类别中。在测试数据上,我们得到了top-1 37.5%, top-5 17.0%的错误率,这个结果比目前的最好结果好很多。
这个神经网络有6000万参数和650000个神经元,包含5个卷积层(某些卷积层后面带有池化层)和3个全连接层,最后是一个1000维的softmax。为了训练的更快,我们使用了非饱和神经元(Relu)
并对卷积操作进行了非常有效的GPU实现。为了减少全连接层的过拟合,我们采用了一个最近开发的名为dropout
的正则化方法,结果证明是非常有效的。
我们也使用这个模型的一个变种参加了ILSVRC-2012竞赛,赢得了冠军并且与第二名 top-5 26.2%的错误率相比,我们取得了top-5 15.3%的错误率。
非线性单元Relu
将神经元输出f建模为输入x的函数的标准方式是用f(x) = tanh(x)或f(x) = (1 + e−x)−1。
考虑到梯度下降的训练时间,这些饱和的非线性比非饱和非线性f(x) = max(0,x)更慢。
根据Nair和Hinton[20]的说法,我们将这种非线性神经元称为修正线性单元(ReLU)。
采用ReLU的深度卷积神经网络训练时间比等价的tanh单元要快几倍。
非线性单元Relu优点
- 可以使网络训练更快
相比于tanh,sigmod而言,relu的导数更好求,反向传播会涉及到激活函数的求导,tanh,sigmod包含指数且表达式复杂,他们的函数的导数求取慢一些。 - 增加网络非线性
relu为非线性函数,加入到神经网络中可以使网络拟合非线性的映射,因此增加了网络的非线性。 - 防止梯度消失(弥散)
当数值过大或者过小时,sigmoid,tanh导数接近0,会导致反向传播时候 梯度消失的问题,relu为非饱和激活函数不存在此问题。 - 使网络具有稀疏性
relu可以使一些神经元输出为0,因此可以增加网络的稀疏性。
Dropout层
softmax作用
将神经网络的输出变为概率分布
-
数据之和为1
-
负数变为正数
[2.0.5.-3]---->约等于[0.81.0.18.0.01]
cross entropy
交叉熵衡量两个概率分布的距离
1.值越小,两个概率越接近
2.值越大,两个概率越不接近
模型1预测的概率分布为[0.81,0.18,0.01]
loss1=-[1 * log(0.81)+0 * log(0.18)+0 * log(0.01)]=0.21
模型2预测的概率分布为[0.5,0,30.2]
loss2=-[1 * log(0.5)+0 * log(0.3)+0 * log(0.2)]=0.69
测试阶段不需要label,只需要传入一张图片,经过softmax之后得到概率分布,概率最大的值即为预测的类别。
模型衡量标准
网络结构及部分参数计算
AlexNet网络结构图
从上图可以看到网络有两个分支,这是由于当时的显卡容量问题,AlexNet 的60M个参数无法全部放在一张显卡上操作,所以采用了两张显卡分开操作的形式。现在我们完成可以合在一起,如下图网络所示。
或者如下图所示:
卷积的一些细节
训练数据
-
随机地从256256的原始图像中截取224224大小的区域(以及水平翻转及镜像),相当于增加了2*(256-224)^2=2048倍的数据量。
如果没有数据增强,仅靠原始的数据量,参数众多的CNN会陷入过拟合中,使用了数据增强后可以大大减轻过拟合,提升泛化能力。 -
对图像的RGB数据进行PCA处理,并对主成分做一个标准差为0.1的高斯扰动,增加一些噪声,这个Trick可以让错误率再下降1%。
-
进行预测时,则是取图片的四个角加中间共5个位置,并进行左右翻转,一共获得10张图片,对他们进行预测并对10次结果求均值。
超参数设置
-
批量大小:batchsize=128
-
权重衰减:weight decay=0.0005
-
学习率:learning rate=0.01 衰减率为0.1
-
轮数:epoches=90
-
卷积核初始化方式:均值为0方差为1的高斯分布
-
偏置初始化方式:2,4,5卷积层及全连接层初始化为1,剩余层初始化为0
知识补充
网络特点
要求重点掌握
- 图像训练的流程(网络训练过程)
- featuremap尺寸 可训练的参数,连接参数的计算
- 防过拟合的技术 (数据增强,dropout)及relu激活函数
三、代码实现
class AlexNet(nn.Module):
def __init__(self, num_classes):
super(AlexNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(64, 192, kernel_size=5, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(192, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
)
self.avgpool = nn.AdaptiveAvgPool2d((6, 6))
self.classifier = nn.Sequential(
nn.Dropout(0.5),
nn.Linear(256 * 6 * 6, 4096),
nn.ReLU(inplace=True),
nn.Dropout(0.5),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Linear(4096, num_classes)
)
def forward(self, x):
x = self.features(x)
x = self.avgpool(x)
x = x.view(x.size(0), 256 * 6 * 6)
logits = self.classifier(x)
probas = F.softmax(logits, dim=1)
return logits, probas