1

我想检查在我的神经网络训练期间是否真的添加和使用了噪声。因此,我使用 keras 构建我的 NN,如下所示:

from keras.layers import Input
from keras.layers.noise import GaussianNoise
inp = Input(tensor=self.X_ph)
noised_x = GaussianNoise(stddev=self.x_noise_std)(inp)
x = Dense(15, activation='elu')(noised_x)
x = Dense(15, activation='elu')(x)
self.estimator = x
...
# kernel weights, as output by the neural network
self.logits = logits = Dense(n_locs * self.n_scales, activation='softplus')(self.estimator)
self.weights = tf.nn.softmax(logits)

# mixture distributions
self.cat = cat = Categorical(logits=logits)
self.components = components = [MultivariateNormalDiag(loc=loc, scale_diag=scale) for loc in locs_array for scale in scales_array]
self.mixtures = mixtures = Mixture(cat=cat, components=components, value=tf.zeros_like(self.y_ph))

然后我使用 edward 执行推理:

self.inference = ed.MAP(data={self.mixtures: self.y_ph})
self.inference.initialize(var_list=tf.trainable_variables(), n_iter=self.n_training_epochs)
tf.global_variables_initializer().run()

根据文档,我最接近这一点的是通过 ed.MAPrun()update()函数。

最好,我会做这样的事情:

noised_x = self.sess.run(self.X_ph, feed_dict={self.X_ph: X, self.y_ph: Y}) 
np.allclose(noised_x, X) --> False

如何在 ed.MAP 中正确验证在火车时间使用噪音并在测试时间禁用噪音?

更新 1

显然,我使用 GaussianNoise 的方式似乎并没有给我的输入添加噪音,因为以下单元测试失败:

X, Y = self.get_samples(std=1.0)

model_no_noise = KernelMixtureNetwork(n_centers=5, x_noise_std=None, y_noise_std=None)
model_no_noise.fit(X,Y)
var_no_noise = model_no_noise.covariance(x_cond=np.array([[2]]))[0][0][0]

model_noise = KernelMixtureNetwork(n_centers=5, x_noise_std=20.0, y_noise_std=20.0)
model_noise.fit(X, Y)
var_noise = model_noise.covariance(x_cond=np.array([[2]]))[0][0][0]
self.assertGreaterEqual(var_noise - var_no_noise, 0.1)

我还确保在inference.update(...)断言 assert tf.keras.backend.learning_phase() == 1 通过期间。

这里哪里出了问题?

4

0 回答 0