AlexNet论文笔记
【1】AlexNet介绍
AlexNet由Alex Krizhevsky于2012年提出,夺得2012年ILSVRC比赛的冠军,top5预测的错误率为16.4%,远超之前的第一名。此后,更多的更深的神经网路被提出,引爆了深度学习研究的热潮。
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函数的定义如下:
Sigmoid激活函数定义为:
tanh激活函数定义为:
由于Sigmoid函数和tanh函数中包含指数函数,因此正向传播过程中的求值与反向传播过程中求梯度计算比较复杂,而ReLU激活函数的显然更简单。因此在训练过程中可以显著提高速度。另外,当|x|的值离原点较远时,Sigmoid函数与tanh函数的梯度接近于0,因此会出现梯度弥散的问题。而ReLU函数可以很好地避免这个问题。
2、局部响应归一化(Local Response Normalization)。LRN的作用是对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。LRN主要是借鉴神经生物学中的侧抑制(lateral inhibito)概念,指的是被激活的神经元抑制与之相邻的神经元。当使用ReLU激活函数时,这种抑制作用很有效。
LRN的计算公式如下:
其中,
是归一化后的值,
是通道的位置,代表更新第几个通道的值,
与
代表待更新像素的位置。
是激活函数
的输出值,
、
、
、
都是自定义系数。
3、重叠的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。并且AlexNet中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
![](/qrcode.jpg)
4、使用Dropout。在第6、7层全连接层使用Dropout随机忽略一部分神经元,以避免模型过拟合。Dropout虽有单独的论文论述,但是AlexNet将其实用化,通过实践证实了它的效果。
5、其他特点。将 随机裁剪为 大小,从而达到数据增强的效果。使用带动量的梯度下降优化算法,batch size设定为128。
以上就是AlexNet论文中涉及的主要内容,希望对大家能够有所帮助。以后将继续发布其他有关论文的笔记。