感谢您花时间阅读我的问题,如下所示。
我需要帮助的问题是,当我使用 NUTS 采样器运行模型时,我的二项式分布输出的维度在第二次迭代期间(自动)发生变化。因此,我的其余代码(此处未给出)会引发尺寸不匹配错误。如果我只通过调用函数(不使用采样器)来运行模型函数,它会很好,即使我一直重复调用函数。但是当我使用采样器时它失败了。
我使用如下所述的更小更简单的代码复制了该问题(此代码不代表我的实际代码,但复制了该问题)。
- 我导入的包:
import pyro
import pyro.distributions as dist
import torch
import pyro.poutine as poutine
from pyro.infer import MCMC, NUTS
Pyro 的版本是 1.5,PyTorch 是 1.7
- 该模型
def model ():
print("***** Start ****")
prior = torch.ones(5) / 5
print("Prior", prior)
a = pyro.sample("a", dist.Binomial(1, prior))
print("A", a)
b = pyro.sample("b", dist.Binomial(1, a))
print("B", b)
print("***** End *****")
return b
def conditioned_model(model, data):
print("**** Condition Model **** ")
return poutine.condition(model, data = {"b":data})()
data = model()
- 直接调用模型生成模拟数据时的输出
***** Start ****
Prior tensor([0.2000, 0.2000, 0.2000, 0.2000, 0.2000])
A tensor([0., 1., 0., 0., 0.])
B tensor([0., 1., 0., 0., 0.])
***** End *****
- MCMC 采样器代码
nuts_kernel = NUTS(conditioned_model, jit_compile=False)
mcmc = MCMC(nuts_kernel,
num_samples=1,
warmup_steps=1,
num_chains=1)
mcmc.run(model, data)
- 运行 MCMC 采样器时的输出(上面的代码)
Warmup: 0%| | 0/2 [00:00, ?it/s]
**** Condition Model ****
***** Start ****
Prior tensor([0.2000, 0.2000, 0.2000, 0.2000, 0.2000])
A tensor([1., 0., 0., 0., 1.])
B tensor([0., 1., 0., 0., 0.])
***** End *****
**** Condition Model ****
***** Start ****
Prior tensor([0.2000, 0.2000, 0.2000, 0.2000, 0.2000])
A tensor([0., 1.])
B tensor([0., 1., 0., 0., 0.])
***** End *****
在上面的输出中,请观察变量A的维度。最初它的大小为 5,后来变为 2。由于我在 DINA 模型中的剩余代码给出了错误。
在上面的代码中,变量A基于先验变量,先验的维度是 5。那么据我所知,A应该始终为 5。请帮助我理解为什么它会变为 2,以及如何避免这种情况发生。
另外,我无法理解的是B的维度始终保持为 5。在上面的代码中,B将A作为输入,但即使A改变了维度, B也不会改变维度。
非常感谢您的帮助。