您可以将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 模型,这可能无法为您提供正确的答案(您从批次计算的梯度可能不是完整的无偏估计 -批量梯度)。