我试图调整本文档中的说明以使用小批量来训练 GPR 模型,但我没有尝试过任何工作。我无法将批处理迭代器提供给 training_loss_closure 方法,也无法将批处理迭代器用于模型的数据属性。有没有办法在 gpflow 中使用具有非变分模型(如 GPR 或 SGPR)的小批量?
问问题
37 次
1 回答
0
您可以将data
元组构造为两个tf.Variable
对象(如果您希望能够拥有不同长度的小批量,您可以传递一个shape=None
或shape=(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 回答