当前位置: 首页 > 知识库问答 >
问题:

TFP概率模型质疑

公冶和豫
2023-03-14

在TFP教程中,模型输出为正态分布。我注意到输出可以替换为独立法线层。在我的模型中,y_true是二进制类。因此,我使用了IndependentBernoulli层,而不是Independent Normal层。

在构建模型之后,我发现它有两个输出参数。这对我来说没有意义,因为伯努利分布只有一个参数。你知道哪里出了问题吗?

# Define the prior weight distribution as Normal of mean=0 and stddev=1.
# Note that, in this example, the we prior distribution is not trainable,
# as we fix its parameters.
def prior(kernel_size, bias_size, dtype=None):
    n = kernel_size + bias_size
    prior_model = Sequential([
            tfpl.DistributionLambda(
                lambda t: tfd.MultivariateNormalDiag(loc=tf.zeros(n), scale_diag=tf.ones(n))
            )
        ])
    return prior_model

# Define variational posterior weight distribution as multivariate Gaussian.
# Note that the learnable parameters for this distribution are the means,
# variances, and covariances.
def posterior(kernel_size, bias_size, dtype=None):
    n = kernel_size + bias_size
    posterior_model = Sequential([
            tfpl.VariableLayer(tfpl.MultivariateNormalTriL.params_size(n), dtype=dtype),
            tfpl.MultivariateNormalTriL(n)
        ])
    return posterior_model

# Create a probabilistic DL model
model = Sequential([
       tfpl.DenseVariational(units=16,
                             input_shape=(6,),
                             make_prior_fn=prior,
                             make_posterior_fn=posterior,
                             kl_weight=1/X_train.shape[0],
                             activation='relu'),
       tfpl.DenseVariational(units=16,
                             make_prior_fn=prior,
                             make_posterior_fn=posterior,
                             kl_weight=1/X_train.shape[0],
                             activation='sigmoid'),
       tfpl.DenseVariational(units=tfpl.IndependentBernoulli.params_size(1),
                             make_prior_fn=prior,
                             make_posterior_fn=posterior,
                             kl_weight=1/X_train.shape[0]),
       tfpl.IndependentBernoulli(1, convert_to_tensor_fn=tfd.Bernoulli.logits)
])             
model.summary()

谷歌Colab上代码执行结果的屏幕截图

共有1个答案

韩飞翮
2023-03-14

我同意摘要显示令人困惑,但我认为这是tfp层实现与keras交互的方式的伪影。在正常操作期间,只有一个来自分布Lambda图层的返回值。但在某些情况下(我不完全理解),分发Lambda.call可能会同时返回分布和边结果。我认为摘要管道出于某种原因触发了这一点,所以看起来有2个输出,但实际上只有一个。尝试在X_train上调用模型对象,你会看到你得到了一个分布(它的类型实际上是一个叫做TensorCoercible的东西,它是一个围绕一个分布的包装器,让你把它传递到调用tf.convert_to_tensor的tf ops中 - 该op的结果值将是调用你的convert_to_tensor_fn的结果)。

总之,您的分布层是好的,但总结是混乱的。它可能会被修复;我没有足够的知识来说明这有多难。

旁注:可以省略event_shape=1参数——默认值为()或“scalar”,其行为相同。

HTH!

 类似资料:
  • 在概率公理中,我们建立了“概率测度”的概念,并使用“面积”来类比。这是对概率的第一步探索。为了让概率这个工具更加有用,数学家进一步构筑了“条件概率”,来深入探索概率中包含的数学结构。我们可以考虑生活中常见的一个估计: 三个公司开发一块地。A占地20%,B占地30%,C占地50%。三个公司规划的绿地占比不同:A土地中40%规划为绿地,B土地中的30%规划为绿地,C土地中的10%规划为绿地。我想选择绿

  • 概率论早期用于研究赌博中的概率事件。赌徒对于结果的判断基于直觉,但高明的赌徒尝试从理性的角度来理解。然而,赌博中的一些结果似乎有矛盾。比如掷一个骰子,每个数字出现的概率相等,都是1/6。然而,如果有两个骰子,那么出现的2到12这些数字的概率却不相同。概率论这门学科正是为了搞清楚这些矛盾背后的原理。 早期的概率论是一门混合了经验的数学学科,并没有严格的用语。因此,概率论在数学的精密架构下,显得有些异

  • 面试时如果被问了一个概率题,那就要小心了,面试官可能要刷人了! 面试概率题的特点: 题面不复杂 短时间可以解答 会者不难 RoadMap 概率论基础 TODO 常见面试题 古典概型 在一个有限的集合 S 中随机抽取一个元素,求该元素属于子集 T 的概率; 概率 p = 子集 T 中元素的数量 / 集合 S 中元素的数量 示例: 一枚均匀的骰子掷到 1 的概率: S = {1,2,3

  • 模型的材质可以有两种定义方式,一种是在代码中导入模型后设置材质,另一种是在建模软件中导出材质信息。下面,我们将分别介绍这两种方法。 代码中设置材质 这种方法与例7.2.1类似,不同之处在于回调函数中设置模型的材质: 例7.3.1 var loader = new THREE.OBJLoader(); loader.load('../lib/port.obj', function(obj) {

  • 本节中,我们将使用3ds Max创建一个茶壶模型,并将导出的没有材质的模型使用Three.js导入场景中。 首先,下载OBJLoader.js并在HTML的<head>中使用: 例7.2.1 <script type="text/javascript" src="OBJLoader.js"></script> 然后,我们需要准备一个*.obj模型,可以使用建模软件导出,也可以在网上下载。这里,我

  • 期望 方差 标准差