tensorflow2.0中BatchNormalization详解 代码举例说明

BatchNormalization即对所有样本归一化,典型的图片的例子,设某一层输入shape为(m, h, w, c),其中m为样本数,h为高,w为宽,c为通道数,应用公式(x-mean)/std,这里的mean的shape为(c,),即对于每一个通道,使用全部样本的这个通道进行归一化。

tf.keras.layers.Batchnormalization():
training:布尔值,指示图层应在训练模式还是在推理模式下运行。
training=True:该图层将使用当前批输入的均值和方差对其输入进行标准化。
training=False:该层将使用在训练期间学习的移动统计数据的均值和方差来标准化其输入。

BatchNormalization 广泛用于 Keras 内置的许多高级卷积神经网络架构,比如 ResNet50、Inception V3 和 Xception。
BatchNormalization 层通常在卷积层或密集连接层之后使用。

批标准化的实现过程

求每一个训练批次数据的均值
求每一个训练批次数据的方差
数据进行标准化
训练参数γ,β
输出y通过γ与β的线性变换得到原来的数值
在训练的正向传播中,不会改变当前输出,只记录下γ与β。在反向传播的时候,根据求得的γ与β通过链式求导方式,求出学习速率以至改变权值。

对于预测阶段时所使用的均值和方差,其实也是来源于训练集。比如我们在模型训练时我们就记录下每个batch下的均值和方差,待训练完毕后,我们求整个训练样本的均值和方差期望值,作为我们进行预测时进行BN的的均值和方差。

批标准化的使用位置
原始论文讲在CNN中一般应作用与非线性激活函数之前,但是,实际上放在激活函数之后效果可能会更好。

代码举例:

input_shape = (2, 2, 2, 2)
input = tf.random.uniform(input_shape,1,5)
output = tf.keras.layers.BatchNormalization()(input, training=True)
print('output:',output)
输出结果:
output: tf.Tensor(
[[[[ 0.7795388   2.3442054 ]
   [-0.31505176  0.19258857]]

  [[ 0.39640334  0.32398266]
   [ 1.3041372  -0.8532975 ]]]


 [[[-1.9667368  -0.66082543]
   [-0.13944194  0.01421221]]

  [[-0.9050044  -1.0440739 ]
   [ 0.84615594 -0.31679147]]]], shape=(2, 2, 2, 2), dtype=float32)
   
#手动计算过程
mean_x = tf.reduce_mean(input, axis=(0, 1, 2))
print('mean_x: ',mean_x.shape)
mean_x = tf.reshape(mean_x, (1, 1, 1, -1))
print('mean_x11: ',mean_x.shape)
std_x = tf.math.reduce_std(input, axis=(0, 1, 2))
std_x = tf.reshape(std_x, (1, 1, 1, -1))
x3 = (input - mean_x) / std_x
print('x3: ',x3)
输出结果:
mean_x:  (2,)
mean_x11:  (1, 1, 1, 2)
x3:  tf.Tensor(
[[[[ 0.78015554  2.3452597 ]
   [-0.3153008   0.19267528]]

  [[ 0.39671704  0.32412845]
   [ 1.305169   -0.8536811 ]]]


 [[[-1.9682922  -0.6611225 ]
   [-0.13955206  0.01421869]]

  [[-0.90572006 -1.0445434 ]
   [ 0.84682536 -0.31693384]]]], shape=(2, 2, 2, 2), dtype=float32)

可以发现结果基本一致,细微差距是因为epsilon(防止除以0)等的引入

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值