10_4_经典卷积网络VGG,GoogLeNet,Inception-1&BatchNorm
ImageNet
AlexNet错误率减了10个百分点
VGG……
LeNet-5
2卷积层+3
AlexNet
5卷积层+3
准确率提升
使用了pooling结构
引进ReLU
引入Dropout
VGG
6个版本,VGG-11 VGG-16 VGG-19……
小窗口3*3、1*1,感受小视野。减少了计算量,并且不损害进度,而且计算很快。
1*1 Convolution
1*1卷积,输出图像大小是一样的。对整个32个通道做convolution,channel变化,实现了维度的改变。
目前常用的是1*1与3*3
GoogLeNet
探索出:使用更小的卷积核;
对同一层,使用多个不同类型的卷积核:
- 前面3个的stride一定变成2,对图片大小保持一样,后面
- Filter concatenation:把来自于不同类型的核再做一个concat
通过这种方法,感受不同大小的视野,全局和局部的信息,获得更多信息量。
具体结构:
Stack more layers?
降低loss并不能简单地堆叠层,但是ResNet能解决这个问题。
Batch Normalization
Intuitive explanation
对于Sigmoid函数,在x<-4或>4的时候是很大的空间,导数接近于0,出现梯度离散的情况。一旦输入不在这个有效的空间里,就会出现梯度为0的情况,很长时间得不到更新,这不是我们希望的。因此会避免使用sigmoid函数,而使用ReLU函数。
如果一定要用sigmoid函数,那么我们需要把输入的值控制在有效的范围之内,做Normalization操作,做等效变换,N(0, σ 2 \sigma^2 σ2),以0为均值, σ \sigma σ为方差。促使落在有效区间附近,在小的范围之内变动,方便优化。
Feature scaling 权值缩放思想
- Image Normalization
图片预处理中,有Image Normalization的步骤,图片数据从[0,255]映射到[0,1]的浮点数的空间,是在0的右侧的分布。
在深度学习,希望数据在x的周围分布,左右对等的分布。直观的原因:比如sigmoid函数的图像,当x比较大或小的时候,梯度趋向于0,我们希望神经网络的值能够在0的周围对称分布
x − m e a n x-mean x−mean为平移, x / s t d x/std x/std为放缩,把数值放到0的周围。通过平移+放缩,移到[-0.5,0.5]或[-1,1]之间。
- Batch Normalization
- mean均值与std方差是动态的
- 根据具体数据进行动态的计算与调整
- 并且还增加了映射的功能 β \beta β、 γ \gamma γ
Batch Norm
4种Normalization。
N张图片,C个channel,H和W。把前面叫做1个batch。把H和W通道混在一起,[N,C,HW]。N=6,表示6章图片;C假设=3,3个channel;HW=784。
Batch Norm,生成只有channel可以移动的数据,[6,3,784]->[3]。对每个channel,生成其均值与方差。取所有的实例上的channel0(1、2)上的feature的均值。生成dimension为1,shape为3的数据,代表当前batch每个channel的feature的均值与方差。消除了b(batch)和F(feature)维度,保留了channel维度。
Layer Norm类似。
Batch normalization
(6,784) ch0。。,这3个channel做统计数据,生成dimension为1,长度为3的统计数据。得到统计数据后,把每一个feature-统计数据 /除以 方差,这个分布就接近于以0为中心,以1为方差的分布。
根据需要,得到中间值之后,额外的 倍数 γ \gamma γ 和 偏置 β \beta β。生成N( β \beta β, γ \gamma γ)的分布。
这样,均值 μ \mu μ和方差 σ \sigma σ是根据当前的batch数据统计出来的,且batch会有历史的记录,总的均值 r u n n i n g _ μ running\_\mu running_μ与总的方差 r u n n i n g _ σ 2 running\_\sigma^2 running_σ2; γ \gamma γ 和 β \beta β是学出来的, γ \gamma γ初始化为1, β \beta β初始化为0,通过梯度信息慢慢会学。
Pipeline
第1步,统计batch的均值,方差
第2步,Normalize操作,减去均值除以方差;再缩放,缩放成N( β \beta β, γ \gamma γ)。
另外, r u n n i n g _ μ running\_\mu running_μ与 r u n n i n g _ σ 2 running\_\sigma^2 running_σ2还需要更新,根据当前的 μ \mu μ和 σ 2 \sigma^2 σ2进行更新;
γ \gamma γ 和 β \beta β是需要梯度信息,这两个参数会自动更新。
layers.BatchNormalization
net=layers.BatchNormalization()
在tensorflow实现BN(BatchNormalization)层。
它是通用层,不分1D、2D、3D……本质上来说,BatchNormalization只需要指定维度,比如说对c维度做batchNormalization,只需要得到RGB3个通道上的均值即可,只需要指定参数axis,叫做轴,默认指定最后一个轴。
center对应 β \beta β,平移量,如果不需要它,设置成False
scale对应 γ \gamma γ,缩放量,如果不需要它,设置成False
trainable意味着上面两个参数是否需要反向传播
net(x,training=None)
层的模式,训练模式与测试模式的行为是不同的
训练模式时,running_mean与running_std是更新的。
代码
gamma、beta
moving_mean表示全局的均值,moving_variance表示全局的方差,它们在前向传播时会实时更新。
推荐out=net(x,training=True)
表示是在训练。
BatchNorm for Image
图片的例子。初始化x为均值为1,方差为0.5的分布,BatchNormalization的目的就是把分布映射到0的周围的分布。
Forward update
训练模式下前向传播的moving_mean和moving_variance的更新。
设定维度axis=3,也就是最后一个维度RGB。
moving_mean会从0逐渐靠近到mean1
moving_variance会从1逐渐靠近到stddev0.5
Backward update
loss函数是随便写的。在反向传播时,gamma和beta会变化,这是在训练模式。
在测试模式下,gamma、beta、moving_mean、moving_variance它们4个都不会更新。
Visualization
看效果,有虚线表示有batch normalize,收敛速度会变快,精度也会提升。
batch Normalization的目的就是将N(100,10)等等这样的分布变成N(0,1)的分布。变成在0附近,方差比较小的范围。由于还有N( β \beta β, γ \gamma γ),会有一定的平移和缩放。
[外链图片转存中…(img-nr5oeEnu-1621043696739)]
Advantage
- 收敛速度更快Converge faster,因为不再处于sigmoid的饱合区域,梯度信息更大,更加容易搜索到最优解
- 更好的表现Better performance
- 更稳定了,参数的调整变得方便;lr的范围就可以比较大一些;超参的调整不会那么敏感