深度学习004:AlexNet网络研究,并用pytorch框架复现网络

 背景介绍

2012年,Hinton的学生Alex Krizhevsky提出了深度卷积神经网络模型AlexNet。

第一个典型的CNN是LeNet5网络结构,但是第一个引起大家注意的网络却是AlexNet,原因AlexNet以显著的优势赢得了2012年的ILSVRC比赛(图像1000分类),top5错误率降低至16.4%。相比较第二名26.2%的成绩,错误率有了巨大的提升,给学术界和工业界带来很大的冲击。

巨大精度提升背后的原因肯定也很值得分析。

AlexNet结构分析

论文中发布的网络结构图如下:

每一层的分析如下:

单GPU训练,网络简化如下:

各层的参数计算如下,下图为5个卷积层的参数:

 

 

可以看到:卷积层的参数明显少于全连接层的参数。其中,网络大概有62.3 million parameters,其中卷积层占比约6%,

 

AlexNet创新点

(1)提出并采用了dropout(随机失活)技术。(发明者:G. Hinton,N. Srivastava,A. Krizhevsky 等)

(2)网络尺寸主要受限于GPU的内存容量和能忍受的训练时间,所以他们的网络在两个GTX 580 3GB GPU上训练五六天。(注意:AlexNet在第2,4,5层均是前一层自己GPU内连接,第3层是与前面两层全连接,全连接是2个GPU全连接)(这种方式,不但提高了训练速度,还提升了精度)

(3)首次使用ReLU激活函数,加快收敛,并且因为tanh在内的很多激活函数都有饱和问题,越到两边越趋于平缓,梯度太小。

(4)使用数据增强:

①水平翻转(2倍)、从一个256*245图像中取提取5次224 × 224的图像块(四个角上的图像块和中心的图像块)(5倍)→扩增了10倍

②改变训练图像的RGB通道的强度。

特点:GPU在训练前一批数据时,CPU在用Python代码图像变换扩充下一批待训练图像。所以,实际上这些数据增强方案是计算免费的,且不会存储在硬盘上。

(5)Local Responce Normalization:局部响应归一层的基本思路是,假如这是网络的一块,比如是 13×13×256, LRN 要做的就是选取一个位置,比如说这样一个位置,从这个位置穿过整个通道,能得到 256 个数字,并进行归一化。进行局部响应归一化的动机是,对于这张 13×13 的图像中的每个位置来说,我们可能并不需要太多的高激活神经元。但是后来,很多研究者发现 LRN 起不到太大作用,因为并不重要,而且我们现在并不用 LRN 来训练网络。

(6)更深的网络。

 

AlexNet网络复现

class AlexNet(nn.Module):
    def __init__(self,num_classes=1000):
        super(AlexNet,self).__init__()
        self.features=nn.Sequential(
            nn.Conv2d(3,96,kernel_size=11,stride=4,padding=2),   #(224+2*2-11)/4+1=55
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3,stride=2),   #(55-3)/2+1=27
            nn.Conv2d(96,256,kernel_size=5,stride=1,padding=2), #(27+2*2-5)/1+1=27
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3,stride=2),   #(27-3)/2+1=13
            nn.Conv2d(256,384,kernel_size=3,stride=1,padding=1),    #(13+1*2-3)/1+1=13
            nn.ReLU(inplace=True),
            nn.Conv2d(384,384,kernel_size=3,stride=1,padding=1),    #(13+1*2-3)/1+1=13
            nn.ReLU(inplace=True),
            nn.Conv2d(384,256,kernel_size=3,stride=1,padding=1),    #13+1*2-3)/1+1=13
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3,stride=2),   #(13-3)/2+1=6
        )   #6*6*256=9126

        self.avgpool=nn.AdaptiveAvgPool2d((6,6))
        self.classifier=nn.Sequential(
            nn.Dropout(),
            nn.Linear(256*6*6,4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            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),-1)
        x=self.classifier(x)
        return x

 

 

 

参考文献

【1】AlexNet论文翻译——中英文对照

https://www.jianshu.com/p/ea922866e3be

【2】深入理解AlexNet网络

https://blog.csdn.net/luoluonuoyasuolong/article/details/81750190

【3】说说AlexNet

https://www.jianshu.com/p/182073af7d95

【4】AlexNet详细解读

https://blog.csdn.net/qq_24695385/article/details/80368618

【5】CNN网络架构演进:从LeNet到DenseNet

https://www.cnblogs.com/skyfsm/p/8451834.html

【6】AlexNet

https://baike.baidu.com/item/AlexNet/22689612?fr=aladdin

【7】Pytorch实现AlexNet解决各类数据集(cifar10/mnist/imagenet)分类

https://www.jianshu.com/p/c5510449e8a6

【8】AlexNet网络的Pytorch实现

https://www.cnblogs.com/ys99/p/10838998.html

转载于:https://www.cnblogs.com/Edison25/p/11065669.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值