AlexNet论文学习

introduction

AlexNet是在2012年被发表的一个经典之作,并在当年取得了lmageNet最好成绩。论文全称为《ImageNet Classification with Deep Convolutional Neural Network》,从论文名字可以看出此网络主要用于图像分类任务,为什么叫它
AlexNet网络,因为论文第一作者为Alex Krizhevsky,因此命名为AlexNet。

注意:AlexNet为经典中的经典,虽然现在用的比较少但是里边用到的一些网络训练技巧,及防过拟合技巧现在一直在使用,所以非常有必要学习。

一、研究背景

AlexNet出现的两个重要条件:

  1. LabelMe,ImageNet等大的标注数据集的出现
  2. 硬件计算能力的提升(算力比较强的GPU等)

神经网络的火爆离不开两个重要的条件,一个是大量的数据,另一个是高性能的硬件。数据不够大,会存在过拟合的问题,由于神经网络包含大量的权重参数,算力不够强,训练速度慢。

在这里插入图片描述
在这里插入图片描述

图像分类问题简介(CNN)

  • 图像物体分类

    是计算机视觉中非常重要的基本问题,也是图像分割、物体跟踪、行为分析等其他高层视觉任务的基础。

  • 深度学习分类两个阶段

  1. 第一阶段:训练阶段
  2. 第二阶段:测试阶段

在这里插入图片描述

图像分类应用(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个参数无法全部放在一张显卡上操作,所以采用了两张显卡分开操作的形式。现在我们完成可以合在一起,如下图网络所示。
在这里插入图片描述
或者如下图所示:
在这里插入图片描述
卷积的一些细节
在这里插入图片描述


训练数据

  1. 随机地从256256的原始图像中截取224224大小的区域(以及水平翻转及镜像),相当于增加了2*(256-224)^2=2048倍的数据量。
    如果没有数据增强,仅靠原始的数据量,参数众多的CNN会陷入过拟合中,使用了数据增强后可以大大减轻过拟合,提升泛化能力。

  2. 对图像的RGB数据进行PCA处理,并对主成分做一个标准差为0.1的高斯扰动,增加一些噪声,这个Trick可以让错误率再下降1%。

  3. 进行预测时,则是取图片的四个角加中间共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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天涯小才

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值