AlexNet分析与简单实现

简介

简单的来讲,在LSVRC 中,获得了最好成绩的Alexnet确实有许多引人深思的地方。作为一个神经网络的初学者,学会分析AlexNet是很有必要的。下面分成两个步骤来了解一下AlexNet.

分析

这里参考了我能看懂的一个博主的文章
https://www.jianshu.com/p/00a53eb5f4b3
里面讲了很详细的网络架构,我就在下面展示出来,看不懂的同仁可以看看上面的这个博客

首先 Alex net由 两个卷积层 +两个池化层 +两个卷积层+一个卷积层+一个池化层 + 两个全连接层+dropout + softmax 层输出 一个1000维度的向量,用作分类

第一层

在这之前得说一说AlexNet的输入
作者采用了2562563的图片,进行预处理(旋转,切割)
之后变成了2242243的图片,之后进行padding填充 成为 2272273的输入
然后 第一层采用了 1111的卷积核,总共96个 ,步长设置为4
经过卷积之后 图片变成了 55 * 55 * 96的输出
计算公式 n - m + 2
p / s + 1 = L
(227 - 11)/4 + 1 = 55

卷积之后进行激活,采用 ReLU 激活函数进行
之后进行MaxPooling 使用的是tensorflow中的keras.layer中定义好的MaxPooling2D,这里不需要填充单元
根据公式 55 - 3 / 2 +1 = 27 最终得到了 2727256的输出
注意:MaxPooling 使用的池化单元为 3*3 步长为 2 重叠池化可以有助于减少过拟合的现象 3 > 2

最后进行Local Response Normalization(L R N)

第二层

同上一层一样,只是卷积核变成了 55, 步长为 1,填充为 2
卷积之后的大小不变
27- 5 + 4/1 +1 = 27
之后进行激活 ReLU()
然后MaxPooling 在这里同样不需要填充
同样是 3
3 步长为 2 27 - 3/ 2 + 1 = 13
最后由 2727256
变成 1313256
最后进行局部响应归一化 LRN

第三层

使用卷积函数,卷积核的大小为 3*3 数量为 384个 步长为 1,填充为1 保持不变
13 - 3 + 2 / 1 + 1 = 13
激活 ReLU

第四层

同第三层

第五层

卷积核 33 数量恢复 256个,步长为一,填充padding = 1
激活函数 ReLU()
MaxPooling 池化 3
3 步长为 2 填充为0
13 - 3 / 2 + 1 = 6
最后得到 6 * 6 * 256的输出

拉平

采用flatten函数,也可以采用大小为4069的66256的卷积核,不过这样会大大增加参数数量,增加大概一千六百万个

第六层

全连接层的第一层,结构输入为 4096个神经元,输出也是4096
中间使用ReLu作为激活函数,使用dropout()有效减少过拟合

第七层

同上层

最后一个

上一层的输出,在这里进行softmax操作,然后输出一个1000维的向量,就得到了最后的结果。

上代码

model = keras.Sequential([
    keras.layers.Conv2D(96,11,4),
    keras.layers.ReLU(),
    keras.layers.MaxPool2D((3,3), 2),
    keras.layers.BatchNormalization(),
    
    keras.layers.Conv2D(256,5,1,padding=[[0,0], [2,2], [2,2], [0,0]]),
    # 这里的卷积操作步长是一,特别注意
    keras.layers.ReLU(),
    keras.layers.MaxPool2D((3,3), 2),
    keras.layers.BatchNormalization(),
    
    keras.layers.Conv2D(384,3,1,padding='SAME'),
    keras.layers.ReLU(),
    keras.layers.Conv2D(384,3,1,padding='SAME'),
    keras.layers.ReLU(),
    
    keras.layers.Conv2D(256,3,1,padding='SAME'),
    keras.layers.ReLU(),
    keras.layers.MaxPool2D((3,3), 2),
    
    keras.layers.Flatten(),
    
    keras.layers.Dense(4096),
    keras.layers.ReLU(),
    keras.layers.Dropout(0.25),
    
    keras.layers.Dense(4096),
    keras.layers.ReLU(),
    keras.layers.Dropout(0.25),
    
    keras.layers.Dense(1000),
    keras.layers.Softmax(),
])

model.build(input_shape=[1, 227, 227, 3])
model.summary()

剩下的几个问题

局部响应归一化

这里其实要说明的是,LRN虽然被证明没什么用,后面还是用了batchNormalization和globalNormalization来看优化,所以说,其中的思想是可以借鉴的
公式中说明
b = a / (k + alpha * Σ ( a j ) **2)**beta
j ∈ (max(0, i-n/2), min(N, i + n/2))
找了几个博客看了又看
才发现,原来是用相邻的核,进行归一化处理,对,你没看错,是用相邻的核,和自己的核,把结果加起来,乘以一个很小的alpha 然后加上偏执 k 再 β次方 , 除掉这个数之后就可以进行归一化了!
在AlexNet中设置 k = 2, alpha = 0.0001,
beta = 0.75, n = 5

dropout

随机舍弃一些节点,可以说,这是一种放弃一半,选择另一半的策略, 就像是随即更新,在训练网络的时候,结合非线性激活函数,可以将结果更加的泛化,使得网络更加的健壮。
说人话:就是在这种随机的情况下,被选到的那一部分会被更新,所以,大量的数据存在的情况下,越来越多的变化累积到一起,就可以将参数之间的差异迅速的展现出来。假如,我被选到的概率是1/2 ,而那些无关的节点被选到的概率也是1/2, 网络被训练完成的时间会大量减少,而每次,我被选到就会更新,变得更加突出,而那些无关的节点,就会因为选到的情况变少,所以更新的就更小,就不会影响结果的正确性。

总结

学习Alexnet 将卷积和Maxpooling结合起来,再进行归一化处理,在全连接的时候,采用dropout的方法可以降低过拟合的现象,并且减少网络训练时间。

后续更新vgg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值