Alexnet总结
最近在看深度学习的论文,看完之后想总结一下,加深一下理解和记忆,有什么不对的地方,请多包涵。那今天给大家带来的是很经典的一篇文章 :《ImageNet Classification with Deep Convolutional Neural Networks》。
摘要
先大体上说一下摘要:
Alexnet有6000万参数和650000个神经元,包含5个卷积层和3个全连接层,最后是一个1000维的softmax。为了训练的更快,使用了非饱和神经元(Relu),并对卷积操作进行了非常有效的GPU实现。为了减少全连接层的过拟合,采用了一个最近开发的名为dropout的正则化方法,结果证明非常有效。
作者在摘要里面重点提到了Relu激活函数和dropout正则化方法,下面就来讲解一下。
非饱和神经元——Relu
先看看Relu激活函数的结构
Relu优点:
1.可以使网络训练更快
2.增加网络的非线性
3.防止梯度消失
4.使网络具有稀疏性
作者在论文中也提到:将神经元输出f建模为输入x的函数的标准方式是用f(x)=tanh(x)或者f(x)=sigmoid(x)。
考虑到梯度下降的训练时间,这些饱和的非线性激活函数比非饱和非线性激活函数**f(x)=max(0,x)**更慢。
采用Relu的深度卷积神经网络训练时间比等价的tanh单元要快几倍。
Relu优点详解:
1.可以使网络训练更快
相比于tanh、sigmoid而言,relu的导数更好求。反向传播会涉及到激活函数的求导,tanh、sigmoid函数包含指数且表达式复杂,它们的导数求解会慢一点。
2.增加网络的非线性
relu为非线性函数,加入到神经网络中可以使网络拟合非线性的映射,因此增加了网络的非线性
3.防止梯度消失
当数值过大或过小时,sigmoid、tanh导数接近为0,会导致反向传播时候梯度消失,relu为非饱和激活函数不存在此问题。
4.使网络具有稀疏性
relu可以使一些神经元输出为0,因此可以增加网络的稀疏性。
以上就是relu的优点,在看看relu在TensorFlow的应用
import tensorflow as tf
# 定义恒定值的tensor
a = tf.constant([-1, 2])
# 创建会话
with tf.Session() as sess:
# 进行relu操作
b = tf.nn.relu(a, name="relu")
print(sess.run(b))
输出结果:[0, 2]
Dropout层
作用:随机将一定比列的神经元置为0
对于一个有N个节点的神经网络,有了dropout层后,就可以看做是2n个模型的集合了。(因为每次训练模型的神经元都不一样,相当于有多个模型在训练)这个相当于机器学习中的模型融合。
Alexnet网络结构和部分参数数量计算
AlexNet的总体结构是上面图片所以,5个卷积层和3个全连接层。relu激活函数在每个卷积层和全连接层都有;max pooling层应用在第1、2、5个卷积层后面;dropout层应用于前两个全连接层,最后一个全连接层没有。因为想加快训练速度,所以在两块GPU上面跑的。
在讲解每一层网络参数及连接计算之前,先讲解一些在tendorflow中的计算知识:
1、卷积特征图(feature map)大小计算公式:
Fo是输出特征图长和宽(假设特征图长宽相同);Fin是输入特征图长宽;p就是padding,是填充的大小;k就是卷积核的大小;s就是stride,是步长。
2、卷积padding方式为VALID时的尺寸计算:
3.卷积padding方式为SAME时的大小计算:
注意:特征图大小也可以这样算:(输入特征图尺寸-卷积核尺寸+2×padding)/stride+1,不过这样一般是反推padding填充大小的,代码里一般是没有padding填充大小的,只有填充类型
4.参数计算:
K为卷积核的大小,Kc为卷积核的通道数,这个1是bias,也就是偏差
5连接数量计算公式:
Foc是输出特征图通道数,也就是卷积核的个数
第一个卷积层
第一层输入数据是227×227×3的原始图像,卷积层的有96个尺寸为11×11×3卷积核,步长为4,padding为VALID。作者是分两个GPU训练的,计算时我们看成一个GPU。所以卷积之后的特征图尺寸为:(227-11+1)/4=54.25,向上取整为55.所依这层特征图的大小为55×55×96。这一层还没经过池化。
第二个卷积层
这一层先进行最大池化,再进行了第二次卷积。最大池化的卷积核为3×3×96,步长为2,padding为valid,所以池化后的特征图尺寸为:(55-3+1)/2=26.5,向上取整为27,27×27×96.然后在进行一次卷积,256个5×5×96的卷积核,步长为1,padding为SAME,所以特征图尺寸为:27/1=27,最后为27×27×256。
第三个卷积层
一样先最大池化,再卷积。最大池化的卷积核为3×3×256,步长为2,padding为VALID,所以(27-3+1)/2=12.5,向上取整为13,最后为13×13×256。再进行卷积,384个3×3×256的卷积核,padding为SAME,步长为1,计算13/1=13,最后结果为13×13×384。
第四个卷积层
这里只有卷积层需要计算,没有最大池化层了。384个3×3×384的卷积核,步长为1,padding为SAME,计算:13/1=13,最后为13×13×384。
第五个卷积层
跟上面一样,只需要计算卷积层不需要计算池化层。256个3×3×384的卷积核,步长为1,padding为SAME,计算:13/1=13,所以最后为:13×13×256。
第一个全连接层
需要先计算最大池化,再计算全连接层。最大池化卷积核为3×3×256,步长为2,padding为VALID,计算:(13-3+1)/2=5.5,向上取整为6,最后为6×6×256。全连接层中用4096个6×6×256的卷积核对输入数据进行卷积,最后得到一个4096的输出。这里全连接层后面跟着relu激活函数层和dropout层。
第二个全连接层
跟上面一样。4096个输入层与4096个输出神经元进行全连接。
第三个全连接层
因为作者是要在1000个类别中进行分类,所以是4096个输入神经元跟1000个输出神经元进行全连接。然后经过softmax得出每个神经元的概率。
网络超参数设置及训练
数据集的处理技巧
1、随机的从256256的原始图像中截取224224大小的区域(以及原始图像的水平翻转和镜像也需要截取),相当于增加了2*(256-224)^2=2048倍的数据量。如果没有数据增强,仅靠原始的数据量,参数众多的CNN会陷入过拟合,使用了数据增强后可以大大减少过拟合,提升泛华能力。
2、对图像的RGB数据进行PCA处理,并对主成分做一个标准差为0.1的高斯扰动,增加一些噪声,这个trick可以让错误率再降1%
PCA(Principal Component Analysis,主成分分析)是一个非常有用的降维技巧。它可以在使用尽可能少维数的前提下,尽量多地保持训练数据的信息。
3、进行预测时,则是取图片的四个角加中间共5个位置,并进行左右翻转,一共获得10张图片,对他们进行预测并对10次结果求平均
超参数设置
批量大小:batch_size=128
权重衰减:weight decay=0.005
学习率:learning rate=0.01 衰减率为0.1
轮数为:epoches=90
卷积核初始化方式:均值为0方差为1的高斯分布
偏差初始化方式:2,4,5卷积层及全连接层初始化为1,剩余层初始化为0.
总结
1、成功使用Relu作为CNN的激活函数,并验证其效果在较深的网络超过sigmoid,成功解决了sigmoid在网络较深时的梯度消失问题
2、训练时使用dropout随机忽略一些神经元,以避免模型过拟合。Dropout虽有单独的论文论述,但是AlexNet将其实用化,通过实践证实了它的效果。在AlexNet中主要是最后几个全连接层使用dropout。
3、在CNN中使用重叠的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。并让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
4、提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。(后来VGG证明这个作用不大)
5、使用CUDA加速神经网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵运算。
6、数据增强,随机的从256256的原始图像中截取224224大小的区域(以及水平翻转及镜像)对图像的RGB数据进行PCA处理,并对主成分加了一个标准差为0.1的高斯扰动,增加了一些噪声。