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个特征进行归一化(我希望归一化后的每个特征都有均值= 0和var = 1.0)?
答案 0 :(得分:1)
在阅读批量标准化(https://arxiv.org/abs/1502.03167)和SELU(https://arxiv.org/abs/1706.02515)的原始论文后,我对它们有了更好的理解:
批量标准化是一种“隔离”程序,以确保输入(在任何小批量中)到下一层具有固定分布,因此所谓的“移位方差”问题是固定的。仿射变换(γ* x ^ +β)仅将标准化的x ^调谐到另一个固定分布以获得更好的表现力。对于简单规范化,我们需要在调用center
时将scale
和False
参数设置为tf.layers.batch_normalization
。
确保将epsilon
(仍然在tf.layers.batch_normalization
)设置为比所有输入数据的最低幅度小至少2个数量级。默认值epsilon
设置为0.001。对于我的情况,一些功能的值低至1e-6。因此,我必须将epsilon
更改为1e-8。
SELU的输入必须在将它们输入模型之前进行标准化。 tf.layers.batch_normalization
不是为此目的而设计的。