0

我对 MNIST 数字进行分类,并且我想多次对每个类的概率(不是潜在函数)进行采样。但是,gp.predict_y仅给出一种情况的概率。

因此,我f_samples = gp.predict_f_samples从底层潜在函数中返回了许多示例。 现在,如何f_samples通过robust_max似然“挤压”?

我的 gp 代码:

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

4

1 回答 1

0

采样后,您将不再使用概率分布 - 您的 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,并且如果潜在均值接近,则可以为您提供一些更平滑的类概率。

于 2020-04-15T16:52:54.683 回答