我正在尝试为我的体系结构自定义Tensorflow概率的DenseLocalReparameterization层。 基本上,我想将Bernoulli变量添加到该图层以将权重相乘。我想用0到1之间的均匀分布来初始化这些伯努利变量的概率,然后对这些概率进行变分推断(后验分布函数仍将是统一的,与先前相同)以进行变量选择。问题是,当我想评估这些变量的后验时,我得到了负数,所以很明显有些东西不起作用。我不确定如何使其工作,将不胜感激!
当前,我使用以下命令初始化另一组名为“ spike”的变量:
spike_posterior_fn=tfd.Uniform(low=0.0, high=tf.math.log(1.0)),
spike_posterior_tensor_fn=lambda d: d.sample(),
spike_prior_fn=tfd.Uniform(low=0.0, high=tf.math.log(1.0)),
spike_divergence_fn=lambda q, p, ignore: tfd.kl_divergence(q, p),
其他变量:
kernel_posterior_fn=tfp_layers_util.default_mean_field_normal_fn(),
kernel_posterior_tensor_fn=lambda d: d.sample(),
kernel_prior_fn=tfp_layers_util.default_multivariate_normal_fn,
kernel_divergence_fn=lambda q, p, ignore: tfd.kl_divergence(q, p),
包括偏见:
bias_posterior_fn=tfp_layers_util.default_mean_field_normal_fn(
is_singular=True),
bias_posterior_tensor_fn=lambda d: d.sample(),
bias_prior_fn=None,
bias_divergence_fn=lambda q, p, ignore: tfd.kl_divergence(q, p)
然后,在“ _apply_variational_kernel”方法下,我执行以下操作:
self.bernoullis=tfd.Bernoulli(logits=
self.spike_posterior.distribution.loc)
self.kernel_posterior_affine = tfd.Normal(loc=self._matmul(inputs,
self.bernoullis*self.kernel_posterior.distribution.loc),
scale=tf.sqrt(self._matmul(tf.square(inputs),tf.square(self.bernoullis*self.kernel_posterior.distribution.scale))))
self.kernel_posterior_affine_tensor = (self.kernel_posterior_tensor_fn(self.kernel_posterior_affine))
self.kernel_posterior_tensor = None
self.spike_posterior_tensor = None
最后,当我要评估“峰值”变量的后验时,我会这样做:
self.model.layers[-1].spike_posterior.distribution.loc
我希望得到0到1之间的值。这应该表示我的权重和联系的后验包含概率。但是,我到处都有数字,包括负值。 显然,我对DenseLocalReparameterization的修改不起作用,但我不知道出什么问题了。
我该如何解决?
谢谢。