1

我有一个二维内核,

k = gpflow.kernels.RBF(lengthscales=[24*5,1e-5])
m = gpflow.models.GPR(data=(X,Y), kernel=k, mean_function=None)

我想修复二维的长度尺度,然后优化另一个。

我可以使用禁用所有长度尺度优化,

gpflow.set_trainable(m.kernel.lengthscales, False) 

但我不能只将一个维度传递给这个方法。

在 GPy 中,我们会调用m.kern.lengthscale[1:].fixed()什么的。

也许我可以使用转换来大致实现这一点(例如这里),但这很复杂。

4

1 回答 1

0

tf.VariableGPflow对每个参数(例如内核的参数)使用单个参数lengthscales,而 TensorFlow 仅允许您更改trainable整个变量的状态。对于任意维度来说,每个维度都有一个单独的参数并不容易实现,但是您可以轻松地子类化您想要的内核并lengthscales使用如下属性覆盖:

import gpflow
import tensorflow as tf

class MyKernel(gpflow.kernels.SquaredExponential):  # or whichever kernel you want
    @property
    def lengthscales(self) -> tf.Tensor:
        return tf.stack([self.lengthscale_0, self.lengthscale_1])

    @lengthscales.setter
    def lengthscales(self, value):
        self.lengthscale_0 = gpflow.Parameter(value[0], transform=gpflow.utilities.positive())
        self.lengthscale_1 = value[1]  # fixed

然后你可以简单地使用k = MyKernel(lengthscales=[24*5, 1e-5]). (虽然 1e-5 的长度尺度看起来不正确!但这超出了这个问题的范围。)

这是有效的,因为超类__init__(在gpflow.kernels.Stationary中) assigns self.lengthscales = Parameter(lengthscales, transform=positive()),所以在这个自定义类中,它调用了属性设置器,而后者又创建了两个单独的属性。然后属性 getter 将它们缝合在一起,用于实际期望二维向量的方法。

于 2020-09-29T09:17:34.790 回答