Tensorflow GPflow多类:如何压缩多个gp.predict_f_样本以获得它们的概率?

Tensorflow GPflow多类:如何压缩多个gp.predict_f_样本以获得它们的概率?,tensorflow,gpflow,Tensorflow,Gpflow,我对MNIST数字进行分类,我想对每个类的概率(不是潜在函数)进行多次采样。然而,gp.predict\u y仅给出了一种情况的概率 因此,我采用f_samples=gp.predict\u f_samples,它从底层潜在函数返回大量示例。 现在,如何通过鲁棒最大似然法“压缩”f_样本? 我的家庭医生代码: kernel = gpflow.kernels.Matern52(input_dim=128, ARD=ARD, active_dims=np.arange(128))\ +

我对MNIST数字进行分类,我想对每个类的概率(不是潜在函数)进行多次采样。然而,
gp.predict\u y
仅给出了一种情况的概率

因此,我采用
f_samples=gp.predict\u f_samples
,它从底层潜在函数返回大量示例。 现在,如何通过鲁棒最大似然法“压缩”f_样本?

我的家庭医生代码:

kernel = gpflow.kernels.Matern52(input_dim=128, ARD=ARD, active_dims=np.arange(128))\
       + gpflow.kernels.White(input_dim=128, active_dims=np.arange(128))

# Robustmax Multiclass Likelihood
  invlink = gpflow.likelihoods.RobustMax(10)  # Robustmax inverse link function
  likelihood = gpflow.likelihoods.MultiClass(10, invlink=invlink)  # Multiclass likelihood
  Z = x_train[::5].copy()  # inducing inputs

  gp = gpflow.models.SVGP(x_train, y_train, num_latent=10,
                          kern=kernel, Z=Z, likelihood=likelihood,
                          whiten=True, q_diag=True)

GPflow版本:1.5.1

一旦采样,就不再使用概率分布-10个潜在函数中的每一个都有实际值。要将样本转换为类上的概率,只需将RobustMax函数(最大潜在函数的概率为1-epsilon,所有其他函数的概率为epsilon/9)应用于所获得的10个值。例如

eps = 0.001
f_samples = gp.predict_f_samples(x_test, num_samples)
largests = np.argmax(f_samples , axis = 2)
prob_samples = (np.eye(10)[largests]*(1-eps-eps/9)+eps/9)
请注意,您得到的概率在一个类上都是0.999,在所有其他类上都是0.0001,这就是RobustMax。如果您打算对样本进行平均,您可能只想调用gp.predict_y(),它实际上集成了概率分布上的RobustMax,并且如果潜在均值接近,可以为您提供更平滑的类概率