@Blackog
2017-12-16T12:12:20.000000Z
字数 1876
阅读 419
深度学习
AlexNet包含5个卷积层和3个全连接层,此外还包含一些max pooling层、LRN层(局部响应归一化),具体结构如下:
在所有层中,用的都是ReLU激活函数。并且上面提到的max pooling层的kernel都是3 * 3,步长为2(有重叠的pooling)
与之前常用的sigmoid和tanh等有饱和状态的函数不同,AlexNet中使用了此前Hiton等提出的ReLU(Rectified
Linear Units)函数,它是非饱和的,可以加速训练。此外,还有许多其他的优点。(详细内容请戳:深度学习中的激活函数)
将网络放到两个GPU上训练,加速是次要的,主要还是因为当时单个的GPU很难能放得下AlexNet如此复杂的神经网络。作者使用的是两块显存为3GB的GTX 580,将网络参数分摊到两个GPU上并行训练。对于论文中给出的结构图,有些地方不是很理解,比如:为什么有些卷积层之间只对上一层中和它在同一个GPU上的map进行卷积?不应该是对上一层所有的map进行卷积吗?
Dropout也是在AlexNet之前就由Hiton等人提出了,但是直到AlexNet才开始发扬光大。Dropout就是说,再训练的时候,所有的神经元都以一定的概率p被置为0,论文中取p=0.5,但是网络的权值都是共享的。这样,每个bacth送进网络进行训练的时候,相当于每次训练的网络结构都是不太相同的。最终训练完成之后,进行分类的时候,所有的神经元都不会被置为0,也就是说Dropout只发生在训练阶段。这样,最后的分类结果其实就相当于集成了多个不同的网络,效果自然会得到提升,泛化能力也强,在一定程度上可以减轻过拟合。
注意,在测试的时候,所有的神经元都要乘以p。个人理解应该是为了使得测试和训练的时候,这一层的输出在一个量级上,否则会影响下一层的输入。比如经过Dropout后,3*3的一个小邻域卷积后得到的结果为5,而没有Dropout时,可能这个结果是10,而后面的输入都是以5为输入进行训练的,所以当将10输入后,肯定会影响之后的结果。
也就是扩充数据集,因为AlexNet要学习的参数有很多,而样本集相对于这个巨大的参数量来说还是有些不够,这种情况下可能会导致过拟合,所以进行数据扩充也会缓解一下过拟合现象。AlexNet主要使用两种方式来对数据集进行扩充:
(1) 平移和旋转。步长为1,从256*256的图像中滑动提取224*224的新图像,这样每张图片得到的新图片为(256-224)^2=1024张。然后在进行水平翻转,最后每张图片可以得到1024*2=2048张图片。虽然说这样得到的图片其实都是极其相似的,但是也还是有效果的。
(2) 对RGB像素值进行降维,这一部分并不是很懂
局部响应归一化,简单来说就是对于在同一位置,不同的map层之间的神经元进行归一化。使得值越大的神经元会更大,小的会更小。这样会增加泛化能力,毕竟这样的话,不同的输入对于这些神经元的影响也会变小,不会过于敏感。论文中还提到说这样会激发不同kernel得到的神经元之间的竞争。不过貌似提升不是很大,现在用的不多。
顾名思义,就是在进行pooling操作时,会有重叠现象。举个例子,之前使用的pooling的kernel大小如果是3*3的话,一般步长也是3,那么上一次进行pooling操作的那些神经元,下一次就不会再出现了;而AlexNet使用的步长则是2,也就是说上一次进行pooling操作的那些神经元,下一次操作时还有一部分也会出现。这样得到的结果当然就更精细,可以一定程度上提升泛化能力。