二、目标分类卷积神经网络结构介绍
随着卷积神经网络的提出,Alex等人首次将其应用到ImageNet比赛中,并斩获2012年ImageNet的冠军。然后越来越多的优秀分类网络结构被提出来,比如vgg16,GoogLeNet,和ResNet等,下面我们来一一介绍其结构及特点。
2.1 AlexNet网络
AlexNet原文在这里。AlexNet是2012年ImageNet竞赛冠军获得者Hinton和他的学生Alex Krizhevsky设计的。在ImageNet大规模视觉挑战赛(ILSVRC)中,AlexNet凭借其独特的卷积神经网络结构以37.5%的top-1错误率和17%的top-5错误率斩获当时比赛的冠军,也是在那年之后,更多的更深的神经网络被提出,开启了深度学习的新时代。AlexNet中含有6千万个参数和大约65万个神经节点,总共有5个卷积层和3个全连接层,最后一层接了一个softmax分类用于输出。除了网络结构的创新外,为了减少网络过拟合的问题,AlexNet还使用了多种策略如dropout和数据增强等。
2.1.1 AlexNet网络结构
ImageNet数据集包括1500万带有分类标签的图片,总共大约有22000个类别。ILSVRC使用ImgetNet中1000个类别(每个类别大约1000张图片)作为数据集,AlexNet使用120万张图片作为训练集,5万张验证集图片以及12万张测试集图片。Alex的网络结构如下图,AlexNet是一个8层的深度神经网络,每个卷积神经网络在完成卷积操作后使用relu函数激活,然后在第一和第二的卷积层激活后还跟了一个LRN(局部响应归一化层),然后再在第一、二、五层卷积层后面又增加了最大池化层。
Type | Filters | Size | Output |
---|---|---|---|
Input | - | - | 227*227*3 |
Convolutional | 96 | 11*11(p=0, s=4) | 55*55*96 |
LRN | - | - | - |
Maxpool | - | 3*3(s=2) | 27*27*96 |
Convolutional | 256 | 5*5(p=2, s=1) | 27*27*256 |
LRN | - | - | - |
Maxpool | - | 3*3(s=2) | 13*13*256 |
Convolutional | 384 | 3*3(p=2, s=1) | 13*13*384 |
Convolutional | 384 | 3*3(p=2, s=1) | 13*13*384 |
Convolutional | 256 | 3*3(p=1, s=1) | 13*13*256 |
Maxpool | - | 3*3(s=2) | 6*6*256 |
Connected | - | 4096 | 4096 |
Connected | - | 4096 | 4096 |
Connected | - | 1000 | 1000 |
在AlexNet中,作者使用了一些tricks来改善网络的性能,当然在目前看来,很多tricks都已经被用烂了,有些tricks也因为其局限性而被淘汰。下面具体介绍一下这些tricks,各位也可以应用到自己的训练网络中去:
- 采用ReLU激活函数
在我们之前的文章中,介绍了激活函数的作用,常用的sigmoid和tanh激活函数由于随着网络层数的增加会导致梯度消失和梯度更新缓慢等问题,AlexNet中引入了ReLU激活函数 f ( x ) = m a x ( 0 , x ) f\left(x \right) =max(0,x) f(x)=max(0,x)。使用ReLU激活函数的卷积神经网络要比tanh激活函数的训练速度快好几倍,如下图所示,虚线表示使用tanh函数的卷积网络,实线表示使用ReLU激活函数的卷积网络。显然,ReLU激活函数比tanh激活函数更快收敛。
- 使用多GPU进行训练
Alex等人利用了两块GPU来进行卷积计算,利用GPU强大的并行计算能力,大大地提高了网络训练的速度(可以理解CPU计算是用一辆法拉利来拉货,GPU是用十辆大卡车拉货,动力或许不及法拉利,但一次可以拉更多的货)。由于论文中使用的是GTX580进行训练,而单个GTX580只有3GB显存,所以作者将AlexNet分布在两个GPU上,每个GPU的显存中只存储一半的神经元参数。因为GPU之间通信方便,可以互相访问显存,而不需要通过主机内存,所以同时使用多块GPU也是非常高效的。目前很多实验室的工作站都是用多路Titan来进行深度学习的训练。
- 使用局部响应归一化层(Local Response Normalization)
在使用ReLU作为激活函数时,其输出没有饱和区,因此ReLU激活函数不需要对输入进行归一化变换来防止梯度饱和。但是Alex等人发现,局部响应归一化仍然有助于提高网络的检测精度,所以其在第一层和第二层卷积层后面增添了两个LRN层以增强泛化能力。局部响应归一化的参数如下所示:
其中, a x , y i a_{x,y}^{i} ax,yi表示神经元激活,通过在 ( x , y ) (x,y) (x,y)位置应用核 i i i,然后应用ReLU非线性来计算,响应归一化激活 b