代码来源于莫烦tensorflow Batch Normalization一节。我添加了一些注释(自己的理解),添加了一些函数的功能介绍。
# 对输入的分散的数据要统一数据规格,这样神经网络可以更好的学习数据的规律,因为数据分布对神经网络是有很大影响的,比如:
# w = 0.1, x1 = 1, x2 =20 --> w*x 0.1, w*x2=2 --> tanh activation function --> tanh(w*x1)接近0,tanh(w*x2)接近1,
#这会使得x增加,w*x接近1或者-1,w*x对较大的x特征范围不敏感.这时候可以对输入数据进行Normalization.
#但是这种情况不仅发生在输入层,所以引入Batch Normalization,在每个batch前向传播时,都要在全连接层与激活函数之间进行Normalization,保持数据分布集中在敏感区域.SGD
# Batch Normalization 包括 标准化工序(x' = x-u/s),s是方差,u是均值.
# 反标准化工序 y = r * x' + b = BN(x')(参数r, b) 自动学习,用于与标准化工序共同调节数据分布.r:扩展参数,b:平移参数
#=================tf.identity()函数作用与control_dependencies===================
# 第一种:
# x_plus_1 = tf.assign_add(x, 1)
#
# #control_dependencies的意义是,在执行with包含的内容(在这里就是 y = x)前,
# #先执行control_dependencies参数中的内容(在这里就是 x_plus_1),这里的解释不准确,先接着看。。。
# with tf.control_dependencies([x_plus_1]):
# y = x
# 第二种:
# x_plus_1 = tf.assign_add(x, 1)
# with tf.control_dependencies([x_plus_1]):
# y = tf.identity(x)#修改部分
#
# 结论:
# 对于control_dependencies这个管理器,只有当里面的操作是一个op时,才会生效,也就是先执行传入的参数op,再执行里面的op。
# 而y=x仅仅是tensor的一个简单赋值,不是定义的op,所以在图中不会形成一个节点,这样该管理器就失效了。
# tf.identity是返回一个一模一样新的tensor的op,这会增加一个新节点到gragh中,这时control_dependencies就会生效,所以第二种情况的输出符合预期。
#
#=========================================================================
#=============================EMA=========================================
# 指数滑动平均(ExponentialMovingAverage)EMA被广泛的应用在深度学习的BN层中,RMSprop,adadelta