验证使用Edward推理时Keras GaussianNoise训练启用及噪声有效性
嘿,我来帮你搞清楚这两个问题:
1. Keras GaussianNoise 在训练/推理阶段的行为(含Edward场景)
首先明确:Keras的GaussianNoise层默认只在训练模式下生效,推理(比如predict、evaluate)时会自动关闭噪声。这是因为噪声是作为正则化手段存在的,测试/推理时不需要引入随机噪声干扰结果。
那结合Edward的情况要注意什么?
- 当你用Edward进行推理(比如
VariationalInference这类拟合后验的过程),本质上是在训练你的Keras网络参数,这时候需要确保Keras处于训练模式。 - 旧版Keras(TensorFlow 1.x)里可以用
keras.backend.set_learning_phase(1)来强制进入训练模式;新版TensorFlow 2.x中,set_learning_phase已被弃用,推荐在调用GaussianNoise层时显式指定training=True,或者在调用整个模型时传递training参数。
比如修改你的层定义:
# 显式指定训练时启用噪声 noised_x = GaussianNoise(stddev=self.x_noise_std)(inp, training=True)
这样不管外部学习阶段如何,训练时都会加噪声(推理时可改为training=False)。
2. 验证你的网络是否真的添加了噪声
给你几个简单的验证方法,亲测有效:
方法1:固定输入,对比多次输出
固定同一个输入,在训练模式下运行网络两次,因为噪声是随机的,两次输出应该不一样;切换到推理模式后,两次输出应该完全相同。代码示例:import numpy as np import keras.backend as K # TF1.x版本:切换到训练模式 K.set_learning_phase(1) # 计算两次输出 output1 = K.eval(self.estimator) output2 = K.eval(self.estimator) # 检查是否有差异(噪声生效的话会返回False) print(np.allclose(output1, output2)) # 切换到推理模式 K.set_learning_phase(0) output3 = K.eval(self.estimator) output4 = K.eval(self.estimator) # 检查是否一致(无噪声的话会返回True) print(np.allclose(output3, output4))TF2.x版本可直接用
self.estimator(inputs, training=True/False)来指定模式方法2:直接对比输入与加噪输出
你可以在训练过程中记录原始输入inp和加噪后的noised_x的数值,查看两者是否存在随机偏差——如果噪声生效,加噪后的输出会和原始输入有随机波动。方法3:对比有无噪声的训练效果
临时注释掉GaussianNoise层,重新训练模型。如果模型的过拟合程度明显增加(比如训练集准确率很高,验证集准确率骤降),说明之前的噪声确实起到了正则化作用,也就是真的被启用了。
内容的提问来源于stack exchange,提问作者whiletrue
相关产品推荐
相关产品推荐

