Сложный event_shape из tfd.Distribution.sample - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь реализовать пользовательский tfd.Distribution, который представляет сложную модель перехода состояний (STM).Мне нужно вернуть кортеж из 2-х массивов с разными измерениями из реализации абстрактного метода tfd.Distribution._sample_n.Однако у меня возникают проблемы, когда метод-обертка (tfd.Distribution.sample) пытается упаковать эти массивы.

STM характеризует популяцию, которая существует в ряде взаимоисключающих состояний.Со временем индивиды в популяции переходят между состояниями по случайному процессу.Чтобы представить реализацию STM (то есть выборки), вы получите вектор длины T, содержащий времена, в которые произошли переходы, и многомерный массив формы [T, M, N], где T - количество временных шагов, M - это число штатов, а N - количество индивидуумов в населении.

Пока у меня есть:

class Foo(tfd.Distribution):
    def __init__(self):
        super().__init__(dtype=tf.float32,
                         #...other config here
                        )

    def _sample_n(self, n, seed=None):
        # Sampling algorithm here
        # t.shape = [T]
        # y.shape = [T, M, N]
        return t, y

foo = Foo()
foo.sample()

Желаемый результат: вызов foo.sample() должен вернутькортеж (tf.tensor, tf.tensor) с формами [T] и [T, M, N] соответственно.

Фактический:

ValueError: Shapes must be equal rank, but are 1 and 3
    From merging shape 0 with other shapes. for 'MyEpidemic/sample/Shape/packed' (op: 'Pack') with input shapes: [11], [11,3,1000].

1 Ответ

1 голос
/ 23 мая 2019

Взгляните на JointDistribution* классы здесь ;они могут справиться с этим.

Обратите внимание, они только в pip install tfp-nightly.

tfp.distributions.JointDistribution
tfp.distributions.JointDistributionCoroutine
tfp.distributions.JointDistributionCoroutine.Root
tfp.distributions.JointDistributionNamed
tfp.distributions.JointDistributionSequential
...