赞
踩
AlexNet是在2012年被发表的一个经典之作,并在当年取得了lmageNet最好成绩。论文全称为《ImageNet Classification with Deep Convolutional Neural Network》,从论文名字可以看出此网络主要用于图像分类任务,为什么叫它
AlexNet网络,因为论文第一作者为Alex Krizhevsky,因此命名为AlexNet。
注意:AlexNet为经典中的经典,虽然现在用的比较少但是里边用到的一些网络训练技巧,及防过拟合技巧现在一直在使用,所以非常有必要学习。
神经网络的火爆离不开两个重要的条件,一个是大量的数据,另一个是高性能的硬件。数据不够大,会存在过拟合的问题,由于神经网络包含大量的权重参数,算力不够强,训练速度慢。
图像物体分类
是计算机视觉中非常重要的基本问题,也是图像分割、物体跟踪、行为分析等其他高层视觉任务的基础。
深度学习分类两个阶段
趋势:让机器更“自主”地学习如何对图像进行分类。
论文结构:
我们训练了一个大型深度卷积神经网络来将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%的错误率。
将神经元输出f建模为输入x的函数的标准方式是用f(x) = tanh(x)或f(x) = (1 + e−x)−1。
考虑到梯度下降的训练时间,这些饱和的非线性比非饱和非线性f(x) = max(0,x)更慢。
根据Nair和Hinton[20]的说法,我们将这种非线性神经元称为修正线性单元(ReLU)。
采用ReLU的深度卷积神经网络训练时间比等价的tanh单元要快几倍。
将神经网络的输出变为概率分布
数据之和为1
负数变为正数
[2.0.5.-3]---->约等于[0.81.0.18.0.01]
交叉熵衡量两个概率分布的距离
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
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。