Убедитесь, что keras GaussianNoise включен во время поезда при использовании логического вывода с Эдвардом
Я хотел бы проверить, действительно ли шум добавляется и используется во время обучения моей нейронной сети. Поэтому я строю свой 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))
Затем я использую Эдварда для выполнения вывода:
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.MAP's run()
а также 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
проходит.
Где что-то могло пойти не так?