TensorFlow10.4 卷积神经网络-batchnorm
我们发现这个sigmoid函数在小于-4或者大于4的时候他的导数趋近于0。然后我们送进去的input的值在[-100,100]之间,这样很容易引起梯度弥散的现象。所以我们一般情况下使用ReLU函数,但是我们有时候又不得不使用sigmoid函数。这个时候我们在送到下一层的时候我们应该先经过Normalization操作。使得这个input变成N(0,\(z^2\))就是他的的input变成以0为均值,然后以z为方差的一个输入。就是使得这个input均匀的散布到0附近,然后再一个很小的范围变动。
我们发现这个\(x_1\)在很小的范围内进行变动的时候这loss变化很缓慢,但是这个\(x_2\)在一个很大的范围内进行变动的时候loss会急剧的变化。就像是第二张图一样,我们\(x_1\),\(x_2\)的范围一样,所以我们这个loss就像是一个圆一样。从哪个方向都一样。
这就是一个Feature scaling的概念。
-
image Normalization
-
Batch Normalization
dynamic mean/std
Batch Norm
这就是一个标准的batch Bormalization
在Tensorflow中实现以一个BN层
BN层的作用:
1,加速收敛;
2,控制过拟合,可以少用Dropout或者不用Dropout;
3,降低网络对初始化权重的不敏感;
4,允许使用比较大的学习率。
5.再也不需要使用使用局部响应归一化层了(局部响应归一化是Alexnet网络用到的方法,搞视觉的估计比较熟悉),因为BN本身就是一个归一化网络层;
解决梯度消失与梯度爆炸的问题
1,网络中训练以batch_size为最小单位不断迭代,新的batch_size进入网络,就会产生新的γ与β,在BN层中,有总图片/batch_size组γ与β被保存。
2,图像卷积的过程中,通常使用多个卷积核,得到多张特征图,对于多个卷积核需要保存多个γ与β。
net = layers.BatchNormalization()
- axis=-1,
- center=True,#如果为True,有beta偏移量
- scale=True,#如果为True,则乘以gamma。
- trainable=True
net(x, training=None)
上面是是否使用\(\alpha\)和\(\beta\)
BN一般放哪一层?
BN层的设定一般是按照conv->bn->scale->relu的顺序来形成一个block
如果不了解每一个层的,请看这个博客
实战:
前向传播的时候:我们发现他的值越来越接近1,他的标准差越来越接近0.5,并且他的\(\gamma\)和\(\beta\)是不会变化的为1,0
在反向传播的时候:他的\(\gamma\)和\(\beta\)是会变化的
好处: