0

float64 で gpflow (2.0rc) を使用しようとしていますが、単純な例でさえ機能させるのに苦労していました。以下を使用して 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}')
4

1 に答える 1