tf.Variable
GPflow对每个参数(例如内核的参数)使用单个参数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 将它们缝合在一起,用于实际期望二维向量的方法。