我想使用 GPFlow 实现扭曲的 GP,遵循这篇有趣的论文。在我的设置中,我定义了非常简单的示例 dataX = tf.convert_to_tensor(np.linspace(0,2*pi,10)[:,np.newaxis],dtype=\'
我想使用 GPFlow 实现扭曲的 GP,请遵循这篇有趣的 paper .
在我的设置中我定义了非常简单的示例数据
X = tf.convert_to_tensor(np.linspace(0,2*pi,10)[:,np.newaxis],dtype="float64")
Y = tf.sin(X)
warper = WarpingFunction()
Z = warper.warp(Y)
GP 模型
import gpflow as gp
kern = gp.kernels.SquaredExponential()
model = gp.models.GPR((X,Z),kernel = kern)
以及一个扭曲类
class WarpingFunction(tf.Module):
def __init__(self,**kwargs):
super(WarpingFunction, self).__init__(**kwargs)
self.a = tf.Variable(initial_value=1.0)
self.b = tf.Variable(initial_value=3.0)
def warp(self,x):
z = self.a*tf.math.pow(x,self.b)
return z
def inverse(self, z):
x = tf.math.sign(z) * tf.math.pow(tf.abs(z), 1.0 / self.b) / self.a
return x
def grad_warp(self,y):
dy = self.a * self.b * y**(self.b-1)
return dy
def loss(self, y):
log_vec = tf.math.log(self.grad_warp(y))
loss_sum = tf.reduce_sum(log_vec)
return loss_sum
进行变形(在本例中为立方体)。
当我思考如何使用 gpflow 优化器训练 a,b
我定义的 WarpingFunction
。我目前的想法是为优化器提供额外的参数 a,b
并编写自定义损失函数
def loss() -> tf.Tensor:
Z_predicted,_ = model.predict_y(X)
squared_error = (Z_predicted - Z) ** 2
return tf.reduce_mean(squared_error) +warper.loss(Z_predicted)
opti = gp.optimizers.Scipy()
opti.minimize(loss,model.trainable_variables + warper.trainable_variables())
我在文档或 SO 中没有找到任何内容。我在文档中看到 gpflow
有一个 Parameter
类,但是 trainable_variables
的参数 opti.minimize
只允许 tf.Variable
类型。
我不太熟悉如何 tensorflow
编写自己的训练循环,尤其是与 GP 问题结合的训练循环。
欢迎提供任何提示和建议!