无法理解张量流概率双射器 'RealNVP' 'log_prob 的工作原理
Having trouble understanding how tensorflow probability Bijectors 'RealNVP' 'log_prob works
这是代码
tfd = tfp.distributions
tfb = tfp.bijectors
# A common choice for a normalizing flow is to use a Gaussian for the base
# distribution. (However, any continuous distribution would work.) E.g.,
nvp = tfd.TransformedDistribution(
distribution=tfd.MultivariateNormalDiag(loc=[0., 0., 0.]),
bijector=tfb.RealNVP(
num_masked=2,
shift_and_log_scale_fn=tfb.real_nvp_default_template(
hidden_layers=[512, 512])))
x = nvp.sample((32,32))
x = nvp.sample((32,32))
给我一个 32x32x3
shape 的张量。但是,当将 x
放入 nvp.log_prob(x)
时,我得到一个 32x32
shape 张量。因为我想得到这个 32,32,3
张量的 log_prob
,所以我期待一个 (1,)
样的张量。
所以问题是,如何修改上面的代码来计算 32x32x3
形张量的 log_prob
?
RNVP 转换向量值分布(即上述情况中的 MVNDiag)。您可以尝试 nvp.distribution.log_prob(x)
(应用基础分布的 log_prob
),并注意它具有相同的形状。 log_prob
函数"consumes"事件形态x
.
变换分布的 log_prob
类似于
nvp.distribution.log_prob(nvp.bijector.inverse(x)) - nvp.bijector.inverse_log_det_jacobian(x)
(我可能换了符号。)
即,它是应用于通过双射变换拉回的样本的基础分布 log_prob
的总和,加上一个校正项以说明(局部,在 x
)变化双射变换引起的体积。
这是代码
tfd = tfp.distributions
tfb = tfp.bijectors
# A common choice for a normalizing flow is to use a Gaussian for the base
# distribution. (However, any continuous distribution would work.) E.g.,
nvp = tfd.TransformedDistribution(
distribution=tfd.MultivariateNormalDiag(loc=[0., 0., 0.]),
bijector=tfb.RealNVP(
num_masked=2,
shift_and_log_scale_fn=tfb.real_nvp_default_template(
hidden_layers=[512, 512])))
x = nvp.sample((32,32))
x = nvp.sample((32,32))
给我一个 32x32x3
shape 的张量。但是,当将 x
放入 nvp.log_prob(x)
时,我得到一个 32x32
shape 张量。因为我想得到这个 32,32,3
张量的 log_prob
,所以我期待一个 (1,)
样的张量。
所以问题是,如何修改上面的代码来计算 32x32x3
形张量的 log_prob
?
RNVP 转换向量值分布(即上述情况中的 MVNDiag)。您可以尝试 nvp.distribution.log_prob(x)
(应用基础分布的 log_prob
),并注意它具有相同的形状。 log_prob
函数"consumes"事件形态x
.
变换分布的 log_prob
类似于
nvp.distribution.log_prob(nvp.bijector.inverse(x)) - nvp.bijector.inverse_log_det_jacobian(x)
(我可能换了符号。)
即,它是应用于通过双射变换拉回的样本的基础分布 log_prob
的总和,加上一个校正项以说明(局部,在 x
)变化双射变换引起的体积。