在我的实现中,我必须先定义权重,不能使用像tf.layers.batch_normalization或tf.layers.dense这样的tensorflow中的高级函数。因此,要进行批处理规范化,我需要使用tf.nn.batch_normalization。我知道,对于计算每个小批的均值和方差,我可以使用tf.nn.moments,但是移动均值和方差又如何呢?有没有人有这样做的经验,或者知道一个实现的例子?我看到人们谈论使用tf.nn.batch_normalization可能很棘手,所以我想知道这样做的复杂性。换句话说,是什么使它变得棘手,以及在实现过程中我应该注意哪些要点?除了移动平均值和方差之外,还有什么是我应该知道的吗?
发布于 2018-09-14 15:35:10
你必须对running_mean和running_variance这两个术语保持警惕。在数学和传统的计算机科学中,它们被称为计算这些值而不看完整数据的方法。它们也被称为online版本的mean和variance。并不是说他们能够事先准确地确定mean和variance。随着更多数据的输入,它们只是不断地提高一些变量mean和variance的值。如果您的数据大小是有限的,那么一旦看到了完整的数据,它们的值就会与所计算的值相匹配,如果完整的数据是可用的。
批归一化的情况不同。您不应该像在上面的段落中那样以相同的方式来看待running mean和running variance。
训练时间
在训练期间,mean和variance是为batch计算的。他们不是running mean或running variance。因此,您可以安全地使用tf.nn.moments来完成这一任务。
测试时间
在测试期间,您使用应该称为population_estimated_mean和population_estimated_variance的内容。这些数量是在培训期间计算的,但没有直接使用。它们是计算出来的,以便以后在测试时使用。
现在的一个陷阱是,有些人可能想要使用Knuth Formula来计算这些数量。这是不可取的。为什么?:,因为,培训是通过几个epochs完成的。因此,相同的数据集显示的次数与epochs的数量一样多。由于数据增强通常也是随机的,因此计算标准running mean和running variance可能是危险的。相反,通常使用的是exponentially decaying estimate。
您可以通过使用tf.train.ExponentialMovingAverage over batch_mean和batch_variance来实现这一点。在这里,你明确指出过去的样本和现在的样本有多大的相关性。通过设置non-trainable,确保用于计算这个值的变量应该是trainable=False。
在测试期间,您将使用这些变量作为mean和variance。
有关实现的更多细节,您可以查看此链接。
https://stackoverflow.com/questions/52333905
复制相似问题