具有softmax可能性的多类别分类

问题描述

GPflow文档为example for multi-class classification提供了robust-max函数。我正在尝试使用softmax可能性训练一个多类分类器,它在GPflow中也是implemented,但是我找不到任何文档或有关如何正确使用它的示例。

请在下面找到我尝试过的示例。在训练过程中,损失逐渐减少。

上面提到的robust-max示例使用分类标签,即值0、1、2,但是仅用softmax可能性代替robust-max会产生IndexError in the quadrature method。因此,我假设这个具有softmax可能性的模型需要一个热编码标签。但是,在测试时,我注意到对于这个三级玩具示例,该模型从未预测过3级。在仔细检查后,softmax可能性具有以下method

def _log_prob(self,F,Y):
        return -tf.nn.sparse_softmax_cross_entropy_with_logits(logits=F,labels=Y[:,0])

看起来需要一个[num_samples,1]形状的分类标签数组。

使用softmax可能性进行GP多类别分类的正确方法是什么?

import numpy as np
import tensorflow as tf
import gpflow
from gpflow.likelihoods.multiclass import softmax
from tqdm.auto import tqdm


np.random.seed(0)
tf.random.set_seed(123)

# Number of functions and number of data points
num_classes = 3
N = 100

# Create training data
# Jitter
jitter_eye = np.eye(N) * 1e-6

# Input
X = np.random.rand(N,1)

# SquaredExponential kernel matrix
kernel_se = gpflow.kernels.SquaredExponential(lengthscales=0.1)
K = kernel_se(X) + jitter_eye

# Latents prior sample
f = np.random.multivariate_normal(mean=np.zeros(N),cov=K,size=(num_classes)).T

# Hard max observation
Y = np.argmax(f,1).reshape(-1,).astype(int)

# One-hot encoding
Y_hot = np.zeros((N,num_classes),dtype=np.int)
Y_hot[np.arange(N),Y] = 1

data = (X,Y_hot)

# sum kernel: Matern32 + White
kernel = gpflow.kernels.Matern32() + gpflow.kernels.White(variance=0.01)
likelihood = softmax(num_classes)
m = gpflow.models.VGP(
    data=data,kernel=kernel,likelihood=likelihood,num_latent_gps=num_classes,)


def run_adam(model,iterations):
    """
    Utility function running the Adam optimizer
    """

    # Create an Adam Optimizer action
    losses = []
    training_loss = model.training_loss
    optimizer = tf.optimizers.Adam()

    @tf.function
    def optimization_step():
        optimizer.minimize(training_loss,model.trainable_variables)

    for step in tqdm(range(iterations),total=iterations):
        optimization_step()
        if step % 10 == 0:
            elbo = -training_loss().numpy()
            losses.append(elbo)
    return losses


run_adam(model=m,iterations=10000)
y_pred = m.predict_y(X)[0]
print("Training accuracy: {:3.2f}".format(np.mean(Y == np.argmax(y_pred,axis=1))))

解决方法

Softmax使用Monte Carlo估计预期的对数可能性,因此您始终需要Adam。 RobustMax的好处是,对于完整的数据集,您可以使用bfgs。我的经验是,从统计角度来看,RobustMax并不是那么好...

我永远都不记得标签应该以什么形式传递,RobustMaxSoftMax之间很可能会有区别。您找到了正确的方法,我将参考tf.nn.sparse_softmax_cross_entropy_with_logits()的TensorFlow文档来确定正确的格式。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...