我有一个 2d 内核,
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()
或者其他的东西。
也许我可以使用转换来粗略地实现这一点(例如here),但这相当复杂。
GPflow 使用单个tf.Variable
对于每个参数 - 例如内核的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__
(in gpflow.kernels.Stationary) 赋值self.lengthscales = Parameter(lengthscales, transform=positive())
,因此在这个自定义类中,它调用属性设置器,该属性设置器又创建两个单独的属性。然后,属性获取器将它们重新拼接在一起,以用于实际需要二维向量的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)