1

SELU 激活函数 ( https://github.com/bioinf-jku/SNNs/blob/master/selu.py ) 要求将输入归一化,使其平均值为 0.0,方差为 1.0。因此,我尝试对原始数据应用tf.layers.batch_normalization( axis=-1) 以满足该要求。每批原始数据的形状为[batch_size, 15],其中 15 表示特征数。下图显示了从tf.layers.batch_normalization(约 20 个时期)返回的 5 个这些特征的方差。它们并不像预期的那样都接近 1.0。平均值也并非都接近 0.0(图表未显示)。

我应该如何独立地对 15 个特征进行标准化(我希望标准化后的每个特征都具有 mean = 0 和 var = 1.0)?

在此处输入图像描述

4

1 回答 1

1

看了batch normalization(https://arxiv.org/abs/1502.03167)和SELU(https://arxiv.org/abs/1706.02515)的原论文,对它们有了更深入的了解:

  1. 批量标准化是一个“隔离”过程,以确保下一层的输入(在任何小批量中)具有固定分布,因此所谓的“移位方差”问题是固定的。仿射变换 ( γ*x^ + β ) 只是将标准化的 x^ 调整到另一个固定分布以获得更好的表现力。为了简单的归一化,我们需要在调用时将centerscale参数转为。Falsetf.layers.batch_normalization

  2. 确保epsilon(仍在tf.layers.batch_normalization)设置为至少比所有输入数据的最低幅度小 2 个幅度。的默认值epsilon设置为 0.001。就我而言,某些特征的值低至 1e-6。因此,我不得不更改epsilon为 1e-8。

  3. SELU 的输入必须在将它们输入模型之前进行归一化。tf.layers.batch_normalization不是为此目的而设计的。

于 2017-09-12T16:38:59.793 回答