新人上手TensorFlow 之 Normalization

上一篇转载自张俊林老师的博客,参考《batch normalization: accelerating deep network training by reducing internal》这篇论文,基本讲了一下,批处理归一化对于神经网络的意义所在及基本的原理和步骤。算是理论上的理解吧!这篇博客,我们来看一下,在TensorFlow中如何实现Normalization!

TensorFlow中的Normalization函数

在TensorFlow中,封装了多种种归一化的函数,分别是:

编号TensorFlow函数数学原理
1tf.nn.l2_normalizeoutput = x / sqrt(max(sum(x**2), epsilon))
2tf.nn.batch_normalization
3tf.nn.moments计算 mean & variance

具体见: https://www.tensorflow.org/api_guides/python/nn#Normalization
官网Normalization

TensorFlow中Normalization函数示例

'''
Normalization in TensorFlow
'''
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf
import numpy as np

x = np.arange(10,dtype = np.float16)
print('x-orig:', x)

sess = tf.Session()

#l2-normalization
x_l2_norm = tf.nn.l2_normalize(x, dim = 0)
x_norm_res = sess.run(x_norm)
print('l2-norm:',x_norm_res)

# batch  normalization
## calculate the mean & variance 
x = tf.constant(x, dtype = tf.float32)
[x_mean, x_varia] = tf.nn.moments(x, axes=0)
offset = 0
scale = 0.1
vari_epsl = 0.0001
## calculate the batch normalization
x_bn = tf.nn.batch_normalization(x, x_mean, x_varia, offset,scale,vari_epsl)
print('mean & vari: ', sess.run( [x_mean, x_varia]))
x_bn_res = sess.run(x_bn)
print('x_bn:', x_bn_res)

sess.close()

运行结果:

x-orig: [ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.]
l2-norm: [ 0.          0.05923489  0.11846977  0.17770466  0.23693955  0.29617444
  0.35540932  0.41464421  0.4738791   0.53311396]
mean & vari:  [4.5, 8.25]
x_bn: [-0.15666895 -0.12185362 -0.0870383  -0.05222298 -0.01740766  0.01740767
  0.05222298  0.08703831  0.12185363  0.15666895]

Normalization 在线性回归问题中的效果

我们将线性回归问题中的数据进行Normalization后,在进行训练,运行结果如下图:

未归一化的训练结果

未归一化的训练结果

用batch Normalization归一化后的训练结果

这里写图片描述

这样对比一看,就知道效果有多明显了,收敛速度快了好几个数量级。这个实验不一定就十分严谨,但是还是很生动形象的。

TensorFlow中的Batch Normalization(批量归一化)是一种用于训练深度神经网络的技术。它通过对每个小批量样本的输入进行归一化,使得网络的每个层都能够更稳定地学习和收敛。 Batch Normalization的作用是使输入数据的均值接近0,方差接近1。这样做的好处是可以加速网络的训练过程,并且提高模型的泛化能力。在深度神经网络中,由于每层之间的输入分布会发生变化,导致网络的学习过程变得困难。Batch Normalization通过对每个小批量样本进行归一化,可以缓解这个问题。 在TensorFlow中,可以使用`tf.keras.layers.BatchNormalization`层来实现Batch Normalization。该层可以在模型中插入,用于对输入进行归一化处理。以下是一个示例代码: ```python import tensorflow as tf model = tf.keras.Sequential([ tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.BatchNormalization(), tf.keras.layers.Dense(10, activation='softmax') ]) # 编译和训练模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=10, batch_size=32) ``` 上述代码中,`tf.keras.layers.BatchNormalization`层被插入到了Dense层之后,用于对Dense层的输出进行归一化处理。然后,模型经过编译和训练,可以进行后续的预测和评估操作。 通过使用Batch Normalization,可以显著提高深度神经网络的训练速度和性能。它是一种常用的正则化技术,被广泛应用于深度学习模型中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值