Спасибо, что нашли время прочитать мою проблему, как указано ниже.
Проблема, в которой мне нужна помощь, заключается в том, что размеры моего вывода биномиального распределения изменяются (автоматически) во время второй итерации, когда я запускаю модель с использованием семплера NUTS. Из-за этого оставшаяся часть моего кода (не приведена здесь) выдает ошибку несоответствия размеров. Если я запускаю функцию модели, просто вызывая функцию (без использования Sampler), она отлично работает, даже если я продолжаю вызывать функцию несколько раз. Но это не удается, когда я использую Sampler.
Я воспроизвел проблему, используя меньший и более простой код, как указано ниже (этот код не представляет мой реальный код, но воспроизводит проблему).
- Пакеты, которые я импортировал:
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 Sampler
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 в качестве входных данных. , но B не меняет размер, даже когда A меняет свой размер.
Большое спасибо за помощь.