0

我试图调整本文档中的说明以使用小批量来训练 GPR 模型,但我没有尝试过任何工作。我无法将批处理迭代器提供给 training_loss_closure 方法,也无法将批处理迭代器用于模型的数据属性。有没有办法在 gpflow 中使用具有非变分模型(如 GPR 或 SGPR)的小批量?

4

1 回答 1

0

您可以将data元组构造为两个tf.Variable对象(如果您希望能够拥有不同长度的小批量,您可以传递一个shape=Noneshape=(None, dim)参数)。就像是

X = tf.Variable(np.zeros(0, input_dim), shape=tf.TensorShape(None, input_dim), dtype=gpflow.default_float())
Y = tf.Variable(np.zeros(0, output_dim), shape=tf.TensorShape(None, output_dim), dtype=gpflow.default_float())
model = gpflow.models.GPR((X, Y), kernel)

然后,您可以编写一个损失函数,接收当前批次,将其分配给变量,然后返回模型损失,如下所示

@tf.function
def loss(data_batch):
    model.data[0].assign(data_batch[0])
    model.data[1].assign(data_batch[1])
    return model.training_loss()

注意:虽然这在数值上是可行的,但对于非 SVGP 模型,这可能无法为您提供正确的答案(您从批次计算的梯度可能不是对全批次梯度的无偏估计)。

于 2021-11-13T16:18:03.287 回答