【问题标题】:Use tf.layers.batch_normalization to preprocess inputs for SELU activation function?使用 tf.layers.batch_normalization 预处理 SELU 激活函数的输入?
【发布时间】:2018-02-18 13:00:49
【问题描述】:

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 个 epoch)返回的 5 个特征的方差。它们并不像预期的那样都接近 1.0。平均值也并非都接近 0.0(图表未显示)。

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

【问题讨论】:

    标签: tensorflow batch-normalization


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2020-07-17
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      相关资源
      最近更新 更多