AlexNet论文笔记

网络结构

AlexNet包含5个卷积层和3个全连接层,此外还包含一些max pooling层、LRN层(局部响应归一化),具体结构如下:

1.第一层为卷积层,共有96个大小为11*11*3的卷积核,步长为4。后跟LRN层和max pooling层。

2.第二层为卷积层,共有256个大小为5*5*96的卷积核,步长为1。后跟LRN层和max pooling层。

3.第三层为卷积层,共有384个大小为3*3*256的卷积核,步长为1。后面没有LRN层和max pooling层。

4.第四层为卷积层,共有384个大小为3*3*384的卷积核,步长为1。后面没有LRN层和max pooling层。

5.第五层为卷积层,共有256个大小为3*3*384的卷积核,步长为1。后面没有LRN层,只有max pooling层。

6.最后三层为全连接层,每一层都有4096个神经元。

在所有层中,用的都是ReLU激活函数。并且上面提到的max pooling层的kernel都是3*3,步长为2(有重叠的pooling)

相关trick

一、加速trick

1. 非饱和激活函数

与之前常用的sigmoid和tanh等有饱和状态的函数不同,AlexNet中使用了此前Hiton等提出的ReLU(Rectified Linear Units)函数,它是非饱和的,可以加速训练。此外,还有许多其他的优点。(详细内容请戳:深度学习中的激活函数)

2. 双GPU训练

将网络放到两个GPU上训练,加速是次要的,主要还是因为当时单个的GPU很难能放得下AlexNet如此复杂的神经网络。作者使用的是两块显存为3GB的GTX 580,将网络参数分摊到两个GPU上并行训练。对于论文中给出的结构图,有些地方不太理解,为什么有些卷积层之间只对上一层中和它在同一个GPU上的map进行卷积?不应该是对上一层所有的map进行卷积吗

二、防止过拟合trick

1. Dropout

Dropout也是在AlexNet之前就由Hiton等人提出了,但是直到AlexNet才开始发扬光大。Dropout就是说,再训练的时候,所有的神经元都以一定的概率p被置为0,论文中取p=0.5,但是网络的权值都是共享的。这样,每个bacth送进网络进行训练的时候,相当于每次训练的网络结构都是不太相同的。最终训练完成之后,进行分类的时候,所有的神经元都不会被置为0,也就是说Dropout只发生在训练阶段。这样,最后的分类结果其实就相当于集成了多个不同的网络,效果自然会得到提升,泛化能力也强,在一定程度上可以减轻过拟合。

注意,在测试的时候,所有的神经元都要乘以p。个人理解应该是为了使得测试和训练的时候,这一层的输出在一个量级上,否则会影响下一层的输入。比如经过Dropout后,3*3的一个小邻域卷积后得到的结果为5,而没有Dropout时,可能这个结果是10,而后面的输入都是以5为输入进行训练的,所以当将10输入后,肯定会影响之后的结果。

2. 数据增强

也就是扩充数据集,因为AlexNet要学习的参数有很多,而样本集相对于这个巨大的参数量来说还是有些不够,这种情况下可能会导致过拟合,所以进行数据扩充也会缓解一下过拟合现象。AlexNet主要使用两种方式来对数据集进行扩充:

(1) 平移和旋转。步长为1,从256*256的图像中滑动提取224*224的新图像,这样每张图片得到的新图片为(256-224)^2=1024张。然后在进行水平翻转,最后每张图片可以得到1024*2=2048张图片。虽然说这样得到的图片其实都是极其相似的,但是也还是有效果的。

(2)对RGB像素值执行PCA等等,这一部分并不是很懂

3. LRN

局部响应归一化,简单来说就是对于在同一位置,不同的map层之间的神经元进行归一化。使得值越大的神经元会更大,小的会更小。这样会增加泛化能力,毕竟这样的话,不同的输入对于这些神经元的影响也会变小,不会过于敏感。论文中还提到说这样会激发不同kernel得到的神经元之间的竞争。不过貌似提升不是很大,现在用的不多。

4. Overlapping Pooling

顾名思义,就是在进行pooling操作时,会有重叠现象。举个例子,之前使用的pooling的kernel大小如果是3*3的话,一般步长也是3,那么上一次进行pooling操作的那些神经元,下一次就不会再出现了;而AlexNet使用的步长则是2,也就是说上一次进行pooling操作的那些神经元,下一次操作时还有一部分也会出现。这样得到的结果当然就更精细,可以一定程度上提升泛化能力。

你可能感兴趣的:(AlexNet论文笔记)