Как создать экземпляр дистрибутива, содержащего переменные, внутри tfp.layers.Дистрибутивlambda

#python #tensorflow #tensorflow2.0 #tensorflow-probability

#python #тензорный поток #tensorflow2.0 #тензорный поток-вероятность

Вопрос:

Я пытаюсь создать tf.keras.Sequential модель, используя tfp.layers.DistributionLambda . Я следую DistributionLambda примеру, но хотел бы tfd.Normal заменить переменную, содержащую tfd.TransformedDistribution RealNVP биектор.

 import tensorflow as tf
import tensorflow_probability as tfp


model = tf.keras.Sequential((
    tf.keras.layers.Lambda(lambda x: tf.shape(x)[-1]),
    tfp.layers.DistributionLambda(lambda t: (
        tfp.distributions.TransformedDistribution(
            distribution=(
                tfp.distributions.MultivariateNormalDiag(loc=tf.zeros(t))),
            bijector=tfp.bijectors.RealNVP(
                num_masked=2,
                shift_and_log_scale_fn=tfp.bijectors.real_nvp_default_template(
                    hidden_layers=[32, 32]))))),
))


x = tf.random.uniform((5, 3))
distribution = model(x)
  

Однако это не удается из-за следующего:

Уровень не может безопасно обеспечить правильное повторное использование переменных в нескольких вызовах, и, следовательно, такое поведение запрещено для безопасности. Лямбда-слои плохо подходят для вычислений с отслеживанием состояния; вместо этого рекомендуется создать подклассный слой для определения слоев с переменными.

Обратите внимание, что RealNVP переменные биектора должны быть инициализированы внутри биектора, в отличие, например Normal , от переменных дистрибутива в DistributionLambda примере, в котором они создаются на верхнем уровне Sequential .

Интересно, есть ли способ использовать DistributionLambda такую настройку, когда переменные должны создаваться в дистрибутиве? Если да, то как правильно обрабатывать переменные внутри DistributionLambda слоя? Если нет, то каков рекомендуемый способ построения подобной модели?

Комментарии:

1. У меня точно такая же проблема. Есть ли какой-либо прогресс в этой проблеме?