我正在尝试将 gpflow (2.0rc) 与 float64 一起使用,并且一直在努力让即使是简单的示例也能正常工作。我使用以下方式配置 gpflow:
gpflow.config.set_default_float(np.float64)
我正在使用 GPR:
# Model construction:
k = gpflow.kernels.Matern52(variance=1.0, lengthscale=0.3)
m = gpflow.models.GPR((X, Y), kernel=k)
m.likelihood.variance = 0.01
事实上,如果我打印一个摘要,两个参数都有 dtype float64。但是,如果我尝试使用此模型进行预测,则会出现错误。
tensorflow.python.framework.errors_impl.InvalidArgumentError: cannot compute AddV2 as input #1(zero-based) was expected to be a double tensor but is a float tensor [Op:AddV2] name: add/
调试会话将我带到 gpr.py 中的以下行(第 88 行)
s = tf.linalg.diag(tf.fill([num_data], self.likelihood.variance))
这将创建一个 dtype 为 float32 的矩阵,从而导致如上所述的爆炸。所以问题似乎与我设置可能性方差的方式有关?
这是演示该问题的完整 Python 脚本:
import numpy as np
import gpflow
gpflow.config.set_default_float(np.float64)
# data:
X = np.random.rand(10, 1)
Y = np.sin(X)
assert X.dtype == np.float64
assert Y.dtype == np.float64
# Model construction:
k = gpflow.kernels.Matern52(variance=1.0, lengthscale=0.3)
m = gpflow.models.GPR((X, Y), kernel=k)
m.likelihood.variance = 0.01
gpflow.utilities.print_summary(m)
# Predict
xx = np.array([[1.0]])
assert xx.dtype == np.float64
mean, var = m.predict_y(xx)
print(f'mean: {mean}')
print(f'var: {var}')