Вероятность распределения порционной смеси в TensorFlow. Вероятность - PullRequest
0 голосов
/ 07 октября 2019

TFP-дистрибутивы должны быть в состоянии пакетно из коробки. Однако я сталкиваюсь с проблемой распределения порционных смесей. Вот игрушечный пример (используется нетерпеливое выполнение):

tfd = tfp.distributions
mix = np.array([[0.6, 0.4],[0.3, 0.7]] )
bimix_gauss = tfd.Mixture(
  cat=tfd.Categorical(probs=mix),
  components=[
    tfd.Normal(loc=[-1.0, -2.0], scale=[0.1, 0.1]),
    tfd.Normal(loc=[+1.0, +2.0], scale=[0.5, 0.5]),
])

print(bimix_gauss.sample())
print(bimix_gauss.prob(0.0))

По сути, это просто кэширование примера по умолчанию: https://www.tensorflow.org/probability/api_docs/python/tfp/distributions/Mixture

Выборка работает нормально, но вероятность этого распределениявозвращает ошибку: InvalidArgumentError: cannot compute Add as input #1(zero-based) was expected to be a double tensor but is a float tensor [Op:Add] name: Mixture/prob/add/

Есть догадки, что я делаю не так?

PS. Тот же пример с пакетным распределением Гаусса работает нормально.

1 Ответ

0 голосов
/ 08 октября 2019

Проблема в том, что numpy по умолчанию использует float64, но TFP следует соглашению TF по умолчанию для float32. Таким образом, ваши обычные Распределения, чьи параметры представляют собой пустые списки Python, преобразуются в tf.Tensors в конструкторе Normal в тензоры float32, что в конечном итоге приводит к ошибке типа. Вы можете исправить это, установив для массива np значение float 32, или, может быть, проще, просто передавая значения смеси в виде списков вместо ndarrays.

...