AlexNet :ImageNet Classification
网络架构:
网络架构整个网络一共有八层,包括5层卷积层,3层全连接层,最后一层为输出层,输出1000维的vector,表示该image在1000类图像的分布情况。
每一卷积层和全连接层的都与激活层相连。第一,第二层卷积层之后,紧连着局部响应归一化层(Local Response Normalization),之后为池化层(下采样,MaxPooling)。第五层卷积层,紧连着池化层。
各层策略:
Local Response Normalization:
将当前神经元的输出与其邻近的n个神经元做归一化,对输出做一个尺度变换,(使得每个输出分布更集中,加快收敛,泛化性能)。ai表示第i个神经元输出,bi表示归一化后的神经元输出,k,a,n为常量,为超参数。
Local Response NormalizationMaxpooling层:
Max Pooling对得到的结果进行下采样,缩小输出结构。以往的池化层,采取无重叠池化。在AlexNet中,作者采用有重叠池化。实验结果表明,有重叠池化较无重叠池化更难于过拟合。假设输入为I,pooling区域大小为F,步长为stride,则输出大小为:(I - F)/stride + 1
当无重叠池化时,F=stride,即 I/stride - F/stride + 1 = I/stride。
文中取F = 3,stride =2 即 (I - 3)/2 + 1
non-overlapping overlapping个人感觉重叠池化做法,与HOG特征生成过程中的归一化有点类似,归一化过程 ,block之间是有重叠的。重叠池化,考虑周围特征,把局部最显著的特征留下。
激活层(激活函数的选择):
tanh Vs ReLu文中从收敛速度角度对比了tanh与ReLu激活函数,如图(实线表示ReLu,虚线表示tanh)。从图可看到,以tanh为激活函数,需要经过更多个epoch才能达到0.25的错误率。以ReLu为激活函数,模型收敛速度更快。
整体架构:
input(224 * 224 *3)
first layer:
first,second layerConv(Filter : 11*11*96,stride=4): (224 - 11)/4 +1 = 55 , 55*55 * 96 (拆成 55*55 * 48,,55*55*48便于两块CPU并行工作)
maxpooling: (55 - 3) /2 +1 = 27
second layer:
Conv (Filter:3*3*256,stride = 1,zero padding,padding = 1):(27+2 - 3)/1 +1 = 27, 27*27*256 (拆成 27*27 * 128,,27*27*128)
maxpooling: (27 - 3) /2 +1 = 13
thrid layer:
Conv (Filter:3*3*384,stride = 1,zero padding,padding = 1):(13+2 - 3)/1 +1 = 13, 13*13*384 (拆成 13*13* 192,,13*13*192)
fourth layer:
Conv (Filter:3*3*384,stride = 1,zero padding,padding = 1):(13+2 - 3)/1 +1 = 13, 13*13*384 (拆成 13*13 * 192,,13*13*192)
Fifth layer:
fifth layerConv (Filter:3*3*256,stride = 1,zero padding,padding = 1):(13+2 - 3)/1 +1 = 13, 13*13*256 (拆成 13*13 * 128,,13*13*128)
maxpooling: (13 - 3) /2 +1 = 6
全连接层
全连接层可看成上一层特征与同等大小的卷积核卷积得到。
第六层:
输入为: 6*6*128
滤波器:6*6 * 4096(4096个滤波器,每个滤波器有128个卷积核,每个卷积核大小 6*6) 得到 1*1*4096
下一层:1*1* 4096
最后一层:1*1*1000(1000个滤波器,每个滤波器有4096个卷积核,每个卷积核大小 1*1)
训练及优化:
减少过拟合风险:
数据增强(data argumentation):
对现有的数据进行一定的变换,用于训练。变换需是有意义的变换
1.对一256*256的图像,随机采样得到224*224的图片,并变换得到其水平反射图像,训练的样本增加2048倍((256-224)**2 * 2)
2.原本图像加上主成分特征向量与特征值和一个随机变量的乘积。
PCA数据变换 注释dropout:以0.5的概率将一些的神经元输出设为0。
训练:
训练策略:用随机梯度下降的动量形式训练模型。
参数更新参数初始化:
以均值为0,标准差为0.01的高斯分布初始化参数w。
学习率的改变:
初始化为0.01,当验证集错误率停止上升时,学习速率除以10,学习速率减小。
问题:为什么归一化层只在前两层?激活层:从线性到非线性的映射。滤波器3*3?maxpooling,3,4,5层的作用。从卷积层到最后输出采用全连接层的作用。
归一化的作用?
overlapping Pooling?
ReLu负半轴为0,未能激活?
代码:https://github.com/kratzert/finetune_alexnet_with_tensorflow