卷积神经网络典型应用———AlexNet

AlexNet by lyx

      • 一 AlexNet简介
      • 二 AlexNet结构
            • 关键:采用dropout的正则化方法来减少全连接层过拟合
      • 三 Alex结构详尽分析
        • COV1!!!
            • 输入:
            • 卷积:
            • 激活函数
            • 降采样操作pool1(池化操作)
        • COV2!!!
            • 输入:
            • 卷积:
            • 激活函数
            • 降采样操作pool2(池化操作)
        • COV3!!!
        • COV4!!!
        • COV5!!!
        • FC6!!!
        • FC7!!!
        • FC8!!!
      • 四 why relu???
      • 五 代码实现gkd
      • 六 论文中提及的多GPU
      • 七 如何理解dropout?
        • 组合派观点
        • 噪声派

一 AlexNet简介

AlexNet卷积神经网络在计算机视觉领域中受到欢迎,它由Alex Krizhevsky,Ilya Sutskever和Geoff Hinton实现。AlexNet在2012年的ImageNet ILSVRC 竞赛中夺冠,性能远远超出第二名(16%的top5错误率,第二名是26%的top5错误率)。这个网络的结构和LeNet非常类似,但是更深更大,并且使用了层叠的卷积层来获取特征(之前通常是只用一个卷积层并且在其后马上跟着一个汇聚层)。

二 AlexNet结构

这个神经网络有6000万参数和650000个神经元,包含5个卷积层(某些卷积层后面带有池化层)和3个全连接层,最后是一个1000维的softmax。
卷积神经网络典型应用———AlexNet_第1张图片卷积神经网络典型应用———AlexNet_第2张图片

关键:采用dropout的正则化方法来减少全连接层过拟合

三 Alex结构详尽分析

COV1!!!

输入:

输入Input的图像规格: 224X224X3(RGB图像),实际上会经过预处理变为227X227X3

卷积:

使用的96个大小规格为11X11X3的过滤器filter,或者称为卷积核(步长为4),进行特征提取,卷积后的数据:
55X55X96 [(227-11)/4+1=55]
此处计算方法为:
(227-11+2*pedding)/4+1=55(此处没有pedding)
即为(image_x-filter_x+2xpedding)/stride+1
96为深度,即96层特征提取

激活函数

使用relu作为激励函数,来确保特征图的值范围在合理范围之内。

float relu(float x)
{if(x<0):
retuern 0 ;
else:
return x;
}

relu1后的数据:55X55X96

降采样操作pool1(池化操作)

pool1的核:3X3 步长:2,降采样之后的数据为27X27X96 [(55-3)/2+1=27]
计算方法:
(origin_x-pool_x)/stride+1
[注意:Alexnet中采用的是最大池化,是为了避免平均池化的模糊化效果,从而保留最显著的特征,并且AlexNet中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性,减少了信息的丢失。]

COV2!!!

输入:

输入27x27x96

卷积:

用256个5X5大小的过滤器filter(步长1)对27X27X96个特征图,进行进一步提取特征,但是处理的方式和conv1不同,过滤器是对96个特征图中的某几个特征图中相应的区域乘以相应的权重,然后加上偏置之后所得到区域进行卷积。经过这样卷积之后,然后在在加上宽度高度两边都填充2像素,会的到一个新的256个特征图.特征图的大小为:
(27+2X2 - 5)/1 +1 = 27 ,也就是会有256个27X27大小的特征图.

激活函数

激活之后为27x27x96

降采样操作pool2(池化操作)

pool1的核:3X3 步长:2,pool2(池化层)降采样之后的数据为13X13X96 [(27-3)/2+1=13]

COV3!!!

没有降采样层
得到(13+2X1 -3)/1 +1 = 13 , 384个13X13的新特征图(核3X3,步长为1)

COV4!!!

没有降采样层
得到(13+2X1 -3)/1 +1 = 13 , 384个13X13的新特征图(核3X3,步长为1)

COV5!!!

输出数据为13X13X256的特征图
降采样操作pool3
pool3的核:3X3 步长:2,pool3(池化层)降采样之后的数据为6X6X256
因为(13-3)/2+1=6

FC6!!!

全连接层,这里使用4096个神经元,对256个大小为6X6特征图,进行一个全连接,也就是将6X6大小的特征图,进行卷积变为一个特征点,然后对于4096个神经元中的一个点,是由256个特征图中某些个特征图卷积之后得到的特征点乘以相应的权重之后,再加上一个偏置得到,之后再进行一个dropout,也就是随机从4096个节点中丢掉一些节点信息(值清0),然后就得到新的4096个神经元。
注:(dropout的使用可以减少过度拟合,丢弃并不影响正向和反向传播。)
注:在经过交叉验证,隐含节点dropout率等于0.5的时候效果最好,原因是0.5的时候dropout随机生成的网络结构最多。

FC7!!!

和FC6类似

FC8!!!

采用的是1000个神经元,然后对fc7中4096个神经元进行全链接,然后会通过高斯过滤器,得到1000个float型的值,也就是我们所看到的预测的可能性。
过程详细可参考:
神经网络模型之AlexNet的一些总结.

四 why relu???

这是一个老生常谈的问题了。。。原因归结如下俩个:
1.sigmoid与tanh有饱和区,Relu函数在x>0时导数一直是1,因为梯度的连乘表达式包括各层激活函数的导数以及各层的权重,reLU解决了激活函数的导数问题,所以有助于缓解梯度消失,也能在一定程度上解决梯度爆炸,从而加快训练速度。
2.无论是正向传播还是反向传播,计算量显著小于sigmoid和tanh。
卷积神经网络典型应用———AlexNet_第3张图片
上图是使用ReLUs和tanh作为激活函数的典型四层网络的在数据集CIFAR-10s实验中,error rate收敛到0.25时的收敛曲线,可以很明显的看到收敛速度的差距。虚线为tanh,实线是ReLUs。

五 代码实现gkd

from keras.models import Sequential
from keras.layers import Dense, Flatten, Dropout
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.utils.np_utils import to_categorical
import numpy as np
seed = 7
np.random.seed(seed)
 
# 创建模型序列
model = Sequential()
#第一层卷积网络,使用96个卷积核,大小为11x11步长为4, 要求输入的图片为227x227, 3个通道,不加边,激活函数使用relu
model.add(Conv2D(96, (11, 11), strides=(1, 1), input_shape=(28, 28, 1), padding='same', activation='relu',
                 kernel_initializer='uniform'))
# 池化层
model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
# 第二层加边使用2565x5的卷积核,加边,激活函数为relu
model.add(Conv2D(256, (5, 5), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
#使用池化层,步长为2
model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
# 第三层卷积,大小为3x3的卷积核使用384个
model.add(Conv2D(384, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
# 第四层卷积,同第三层
model.add(Conv2D(384, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
# 第五层卷积使用的卷积核为256个,其他同上
model.add(Conv2D(256, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
 
model.add(Flatten())
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
model.summary()

六 论文中提及的多GPU

卷积神经网络典型应用———AlexNet_第4张图片
首先这幅图分为上下两个部分的网络,论文中提到这两部分网络是分别对应两个GPU,只有到了特定的网络层后才需要两块GPU进行交互,这种设置完全是利用两块GPU来提高运算的效率,其实在网络结构上差异不是很大。为了更方便的理解,我们假设现在只有一块GPU或者我们用CPU进行运算,我们从这个稍微简化点的方向区分析这个网络结构。网络总共的层数为8层,5层卷积,3层全连接层。

七 如何理解dropout?

dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。
它的主要作用是防止过拟合问题。
所以为啥dropout具有这种效果呢,目前有两种主流观点:

组合派观点

Dropout的出现很好的可以解决这个问题,每次做完dropout,相当于从原始的网络中找到一个更瘦的网络,如下图所示:

卷积神经网络典型应用———AlexNet_第5张图片因而,对于一个有N个节点的神经网络,有了dropout后,就可以看做是2的n次方个模型的集合了,但此时要训练的参数数目却是不变的,这就解脱了费时的问题。
这样的话就相当于是打破了神经元之间的联合适应性,从而增强了泛化能力,它通过选择一个神经元,迫使它与随机选取的神经元协同工作。
有了dropout后,神经网络的训练和预测就会发生一些变化。
对于训练过程有如下变化

卷积神经网络典型应用———AlexNet_第6张图片对应的公式变化如下如下:
没有dropout:
卷积神经网络典型应用———AlexNet_第7张图片

有dropout:

卷积神经网络典型应用———AlexNet_第8张图片

对于测试过程有如下变化:
预测的时候,每一个单元的参数要预乘以p。

卷积神经网络典型应用———AlexNet_第9张图片

噪声派

观点十分明确,就是对于每一个dropout后的网络,进行训练时,相当于做了数据增强(Data Augmentation),因为,总可以找到一个样本,使得在原始的网络上也能达到dropout单元后的效果。 比如,对于某一层,dropout一些单元后,形成的结果是(1.5,0,2.5,0,1,2,0),其中0是被drop的单元,那么总能找到一个样本,使得结果也是如此。这样,每一次dropout其实都相当于增加了样本。
补充知识:
在线性空间中,学习一个整个空间的特征集合是足够的,但是当数据分布在非线性不连续的空间中得时候,则学习局部空间的特征集合会比较好。

你可能感兴趣的:(卷积,深度学习)