GPFlow-2.0 - проблема с default_float и дисперсией вероятности - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь использовать gpflow (2.0r c) с 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))

Это создает матрицу с типом 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}')

1 Ответ

0 голосов
/ 04 февраля 2020

Я проверил, и, по-видимому, можно ответить на ваш собственный вопрос здесь.

После дальнейшего изучения и поднятия проблемы с github я хочу добавить несколько последующих действий.

быстрый ответ на мой вопрос: да, проблема в том, как я устанавливаю дисперсию. Если бы я установил это так:

m.likelihood.variance.assign(0.01)

, тогда мой код работал бы. (Хотя это не совсем эквивалентно, поскольку дисперсия правдоподобия в настоящее время является обучаемым параметром.)

Но это только проявление более широкой проблемы с API Tensorflow - как поднимается здесь: https://github.com/tensorflow/tensorflow/issues/26033

Попытка использовать float64s вместо плавающего по умолчанию float32 в любой библиотеке, построенной на основе tenorflow, может быть болезненной, пока эта проблема не будет решена.

Это приводит к довольно враждебным функциям API пользователя, если вы пытаетесь использовать float64s, так как в некоторых местах Python аргументы с плавающей точкой подходят, в то время как в других их нужно приводить к правильному размеру с плавающей точкой.

Вот пример из тензорного вероятности, который демонстрирует проблему:

adaptive_hmc = tfp.mcmc.SimpleStepSizeAdaptation(
    hmc, 
    num_adaptation_steps=10, 
    target_accept_prob=0.75,
    adaptation_rate=0.1
)

Сравните аргументы target_accept_prob и adaption_rate. Чтобы на самом деле это заработало, требуется привести аргумент target_accept_prob с чем-то вроде «tf.cast (0.75, dtype = tf.float64)», но аргумент adaption_rate подходит для использования с float32 или float64. Вам нужно покопаться в источнике или дождаться исключения и попытаться выяснить, какой аргумент заставляет его знать, где требуются такие приведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...