AlexNet论文笔记

在这里插入图片描述

【1】AlexNet介绍

AlexNet由Alex Krizhevsky于2012年提出,夺得2012年ILSVRC比赛的冠军,top5预测的错误率为16.4%,远超之前的第一名。此后,更多的更深的神经网路被提出,引爆了深度学习研究的热潮。

AlexNet网络结构
AlexNet采用8层的神经网络,包含6亿3000万个链接,6000万个参数和65万个神经元,并且花了五到六天的时间,在两个GTX580型号的GPU上来训练完成。

【2】网络结构详解

AlexNet采用8层的神经网络,5个卷积层和3个全连接层。其中第2、4、5层只以单个GPU中的feature map作为输入,其他层将两个GPU中同一层次的feature map叠加起来作为输入。在第1、2层卷积之后分别添加了所谓的LRN层(文章后面有介绍),然后是max pooling层。在第5层卷积之后添加了max pooling层。第6、7层为全连接层,其后分别添加了概率为0.5的Dropout层。

下面代码为网络结构的Pytorch实现(未包含LRN层):

class Net(torch.nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = torch.nn.Sequential(
            torch.nn.Conv2d(3, 96, 11, 4, 0),
            torch.nn.ReLU(),
            torch.nn.MaxPool2d(3,2)
        )
        self.conv2 = torch.nn.Sequential(
            torch.nn.Conv2d(96, 256, 5, 1, 2),
            torch.nn.ReLU(),
            torch.nn.MaxPool2d(3,2)
        )
        self.conv3 = torch.nn.Sequential(
            torch.nn.Conv2d(256,384, 3, 1, 1),
            torch.nn.ReLU(),
        )
        self.conv4 = torch.nn.Sequential(
            torch.nn.Conv2d(384,384, 3, 1, 1),
            torch.nn.ReLU(),
        )
        self.conv5 = torch.nn.Sequential(
            torch.nn.Conv2d(384,256, 3, 1, 1),
            torch.nn.ReLU(),
            torch.nn.MaxPool2d(3,2)
        )
        self.dense = torch.nn.Sequential(
            torch.nn.Linear(9216, 4096),
            torch.nn.ReLU(),
            torch.nn.Dropout(0.5),
            torch.nn.Linear(4096, 4096),
            torch.nn.ReLU(),
            torch.nn.Dropout(0.5),
            torch.nn.Linear(4096, 1000)
        )

    def forward(self, x):
        conv1_out = self.conv1(x)
        conv2_out = self.conv2(conv1_out)
        conv3_out = self.conv3(conv2_out)
        conv4_out = self.conv4(conv3_out)
        conv5_out = self.conv5(conv4_out)
        res = conv5_out.view(conv5_out.size(0), -1)
        out = self.dense(res)
        return out

【3】AlexNet的特点

AlexNet取得比较好的效果离不开如下的特点:

1、使用ReLU激活函数。ReLU函数的定义如下: f ( x ) = m a x ( 0 , x ) f(x)=max(0,x)
Sigmoid激活函数定义为: f ( x ) = 1 1 + e x f(x)=\frac{1}{1+e^{-x}}
tanh激活函数定义为: f ( x ) = e x e x e x + e x f(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}
由于Sigmoid函数和tanh函数中包含指数函数,因此正向传播过程中的求值与反向传播过程中求梯度计算比较复杂,而ReLU激活函数的显然更简单。因此在训练过程中可以显著提高速度。另外,当|x|的值离原点较远时,Sigmoid函数与tanh函数的梯度接近于0,因此会出现梯度弥散的问题。而ReLU函数可以很好地避免这个问题。

2、局部响应归一化(Local Response Normalization)。LRN的作用是对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。LRN主要是借鉴神经生物学中的侧抑制(lateral inhibito)概念,指的是被激活的神经元抑制与之相邻的神经元。当使用ReLU激活函数时,这种抑制作用很有效。

LRN的计算公式如下: b x , y i = a x , y i / ( k + α j = m a x ( x , i n / 2 ) m i n ( N 1 , i + n / 2 ) ( a x , y j ) 2 ) β b^i_{x,y}=a^i_{x,y}/\left(k+\alpha\sum^{min(N-1,i+n/2)}_{j=max(x,i-n/2)}(a^j_{x,y})^2\right)^\beta
其中, b x , y i b^i_{x,y} 是归一化后的值, i i 是通道的位置,代表更新第几个通道的值, x x y y 代表待更新像素的位置。 a x , y i a^i_{x,y} 是激活函数 R e L U ReLU 的输出值, k k α \alpha β \beta n / 2 n/2 都是自定义系数。

3、重叠的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。并且AlexNet中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。

扫描二维码关注公众号,回复: 4326604 查看本文章

4、使用Dropout。在第6、7层全连接层使用Dropout随机忽略一部分神经元,以避免模型过拟合。Dropout虽有单独的论文论述,但是AlexNet将其实用化,通过实践证实了它的效果。

5、其他特点。将 256 × 256 256\times256 随机裁剪为 224 × 224 224\times224 大小,从而达到数据增强的效果。使用带动量的梯度下降优化算法,batch size设定为128。

以上就是AlexNet论文中涉及的主要内容,希望对大家能够有所帮助。以后将继续发布其他有关论文的笔记。

猜你喜欢

转载自blog.csdn.net/weixin_41793877/article/details/84696828