新人上手TensorFlow 之 Normalization
程序员文章站
2022-07-16 18:45:53
...
上一篇转载自张俊林老师的博客,参考《batch normalization: accelerating deep network training by reducing internal》这篇论文,基本讲了一下,批处理归一化对于神经网络的意义所在及基本的原理和步骤。算是理论上的理解吧!这篇博客,我们来看一下,在TensorFlow中如何实现Normalization!
TensorFlow中的Normalization函数
在TensorFlow中,封装了多种种归一化的函数,分别是:
编号 | TensorFlow函数 | 数学原理 |
---|---|---|
1 | tf.nn.l2_normalize | output = x / sqrt(max(sum(x**2), epsilon)) |
2 | tf.nn.batch_normalization | |
3 | tf.nn.moments | 计算 mean & variance |
具体见: https://www.tensorflow.org/api_guides/python/nn#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归一化后的训练结果
这样对比一看,就知道效果有多明显了,收敛速度快了好几个数量级。这个实验不一定就十分严谨,但是还是很生动形象的。