#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. У меня точно такая же проблема. Есть ли какой-либо прогресс в этой проблеме?