список nan при выполнении вывода в Tensorflow 2.1 - PullRequest
0 голосов
/ 22 января 2020

Я новичок в Tensorflow 2.1 и хочу использовать его для вывода какой-то нормальной переменной. Модель похожа на модель Trueskill (https://papers.nips.cc/paper/3079-trueskilltm-a-bayesian-skill-rating-system), и я хочу использовать Variational Inference для обновления моих априорных показателей. В моем случае модель p (s_1, s_2, p_1, p_2, d) = p (s_1) p (p_1 | s_1) p (s_2) p (p_2 | s_1) p (d | p_1, p_2). Для этого я определяю два нормальных (моих предыдущих), я устанавливаю модель с помощью JointDistributionCoroutine. Я определяю случайную величину для среднего поля, настраиваю потери и запускаю оптимизацию. Потеря, которую я получаю, - это массив 'nan'. Я не понимаю, почему ... Я следил за ноутбуком «Вероятность» c PCA (https://github.com/tensorflow/probability/blob/master/tensorflow_probability/examples/jupyter_notebooks/Probabilistic_PCA.ipynb). Если кто-то может мне помочь, если будет замечательно .. Вот код, который я запускаю, и результаты.

import tensorflow as tf
import tensorflow_probability as tfp
from tensorflow_probability import distributions as tfd
tfd = tfp.distributions
Root = tfd.JointDistributionCoroutine.Root
dtype = tf.float64


def model():
    s1 = yield Root(tfd.Independent(tfd.Normal(loc = tf.cast(28.0, dtype), scale =  64.0)))
    p1 = yield tfd.Normal(loc = s1, scale = 16.0)
    s2 = yield Root(tfd.Independent(tfd.Normal(loc = tf.cast(22.0, dtype), scale =  60.0)))
    p2 = yield tfd.Normal(loc = s2, scale = 16.0)
    d = yield tfd.Normal(loc = p1 - p2, scale = 0)

joint = tfd.JointDistributionCoroutine(model)
x_train = 1.0
target_log_prob_fn = lambda qs1, qp1, qs2, qp2 : joint.log_prob((qs1, qp1, qs2, qp2, x_train))


qs1_mean = tf.Variable(tf.cast(20, dtype))
qs1_stddv = tf.nn.softplus(tf.Variable(tf.Variable(tf.cast(20, dtype))))


qp1_mean = tf.Variable(tf.cast(20, dtype))
qp1_stddv = tf.nn.softplus(tf.Variable(tf.Variable(tf.cast(20, dtype))))


qs2_mean = tf.Variable(tf.cast(20, dtype))
qs2_stddv = tf.nn.softplus(tf.Variable(tf.Variable(tf.cast(20, dtype))))


qp2_mean = tf.Variable(tf.cast(20, dtype))
qp2_stddv = tf.nn.softplus(tf.Variable(tf.Variable(tf.cast(20, dtype))))



def factored_normal_variational_model():
    qs1 = yield Root(tfd.Independent(tfd.Normal(loc = qs1_mean, scale =  qs1_stddv)))
    qp1 = yield tfd.Normal(loc = qp1_mean, scale = qp1_stddv)
    qs2 = yield Root(tfd.Independent(tfd.Normal(loc = qs2_mean, scale =  qs2_stddv)))
    qp2 = yield tfd.Normal(loc = qp2_mean, scale = qp2_stddv)

surrogate_posterior = tfd.JointDistributionCoroutine(
    factored_normal_variational_model)

losses = tfp.vi.fit_surrogate_posterior(
    target_log_prob_fn,
    surrogate_posterior=surrogate_posterior,
    optimizer=tf.optimizers.Adam(learning_rate=0.15),
    num_steps=200)

print(losses)
---------------------------------------------------------------------------

tf.Tensor(
[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan], shape=(200,), dtype=float64)
...