Python 在tfp中训练变分贝叶斯神经网络时,我如何分别可视化损失中不同项的演化?

Python 在tfp中训练变分贝叶斯神经网络时,我如何分别可视化损失中不同项的演化?,python,tensorflow,machine-learning,neural-network,tensorflow-probability,Python,Tensorflow,Machine Learning,Neural Network,Tensorflow Probability,我想用张量流概率来训练一个简单的完全连通的贝叶斯神经网络。损失由KL项和负对数似然项组成。我如何看待它们与全要素生产率的不同演变 我有以下代码: import matplotlib.pyplot as plt import numpy as np import tensorflow as tf import tensorflow_probability as tfp tfk = tf.keras tfkl = tf.keras.layers tfpl = tfp.layers tfd = tf

我想用张量流概率来训练一个简单的完全连通的贝叶斯神经网络。损失由KL项和负对数似然项组成。我如何看待它们与全要素生产率的不同演变

我有以下代码:

import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
import tensorflow_probability as tfp

tfk = tf.keras
tfkl = tf.keras.layers
tfpl = tfp.layers
tfd = tfp.distributions

[make some data for a regression task]

input = tfkl.Input(n_features)
x = input
x = tfpl.DenseFlipout(100, activation='relu')(x)
x = tfpl.DenseFlipout(2)(x)
x = tfpl.DistributionLambda(lambda t: tfd.Normal(loc=t[..., :1],
                                                 scale=1e-3 + tf.math.softplus(t[..., 1:])))(x)

model = tfk.Model(input, x)

negloglik = lambda y, rv_y: -rv_y.log_prob(y)

model.compile(optimizer=tf.optimizers.Adam(), loss=negloglik, metrics=['mse'])
history = model.fit(x_train, y_train, epochs=10, validation_data=(x_val, y_val));
损失函数是每个
DenseFlipout
层中的显式项
negloglik
和KL散度项的总和(例如,我可以通过查看
model.loss
看到它们)

如何将这些术语分别可视化


尝试:

如果我尝试将计算
negloglik
的函数添加到度量中,例如

def negloglik_met(y_true, y_pred):
    return -y_pred.log_prob(y_true)
我得到的
AttributeError:“Tensor”对象没有属性“log\u prob”
,这让我很困惑
y_pred
应该是
DistributionLambda
层的输出,那么为什么它是张量而不是分布呢


另外一个我希望能起作用但没有起作用的方法是将
model.loss[0]
添加到指标中。在那里,我得到了
ValueError:无法解释度量函数标识符:Tensor(“稠密的翻转/发散的内核:0”,shape=(),dtype=float32)

我深入研究了TensorFlow代码。这是由于自动TensorFlow围绕(lambda)函数创建了一个自动包装器。它将模型输出(分布)转换为度量的类型(这在我看来很奇怪)。因此,为了防止这种情况发生,您应该创建自己的包装器,它不执行此强制转换。执行此操作的代码位于:


因此,在这段代码上激励自己,制作自己的度量包装器。这应该是TFP的一个特点。

我也面临同样的问题。看见我认为这是一个bug(在TF或TFP中)。TF似乎假设损失函数(在本例中也是一个度量)的输入是张量,或者,在训练过程中,分布的样本被传递到这个度量(损失)而不是分布。我接受这一点,部分原因是您留下的代码确实为我解决了这一问题。不幸的是,它不允许我设置依赖于权重值而不是最终预测的指标,例如上面的KL偏差(尽管这里我可以通过知道总损失和负对数可能性来计算,这不是通用的)。