Как построить векторизованные объекты гауссовского процесса с TensorFlow Probability? - PullRequest
0 голосов
/ 06 мая 2019

Я учусь приспосабливаться к гауссовскому процессу, используя тензор-вероятность. Поскольку моя модель требует установки множества f функций, я должен создать пакет гауссовских процессов. Поэтому я надеюсь собрать их все в одной функции gp. Тем не менее, у меня есть проблемы в программировании с тензорным потоком в определенных ситуациях

Если мое резюме сбивает с толку, позвольте мне продемонстрировать мою проблему на нескольких примерах.

Предположим, что я хочу построить GP с ядром Гаусса с parameter формой (5,3) и index_points (120, 5, 3). Я могу установить feature_ndims=2 и установить в качестве первого блока кодирования (я составил индексные точки, чтобы убедиться, что форма соответствует).

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import tensorflow as tf
import tensorflow_probability as tfp

tfd = tfp.distributions
tfb = tfp.bijectors
tfp_kernels = tfp.positive_semidefinite_kernels
plt.style.use('ggplot')
sns.set_context('notebook')

ff = lambda x, feature_dim, num_gp: \
    np.sin(10*x) * np.exp(-x) + \
    np.random.normal(0, 1, [num_gp, np.shape(x)[0], feature_dim])

num_gp=5
feature_dim=3
zero_vector = np.zeros([num_gp, feature_dim])
one_vector = np.ones([num_gp, feature_dim])

input_signal = ff(np.linspace(-1., 1., 120)[..., np.newaxis], feature_dim, num_gp)
print(input_signal.shape)

input_signal = np.reshape(input_signal, [120, num_gp, feature_dim])
print(input_signal.shape)

rv_amp_1 = tfd.LogNormal(loc=1.0+zero_vector,
                         scale=one_vector,
                         name='rv_amp_1')
print(rv_amp_1.sample(1).shape)
vec_rv_amp_1 = tfd.Independent(distribution=rv_amp_1,
                               reinterpreted_batch_ndims=1,
                               name='vec_rv_amp_1')
print(vec_rv_amp_1.sample(1).shape)
rv_scale_1 = tfd.LogNormal(loc=0.1*one_vector,
                           scale=one_vector)
vec_rv_scale_1 = tfd.Independent(distribution=rv_scale_1,
                                 reinterpreted_batch_ndims=1,
                                 name='vec_rv_scale_1')

kernel_1 = tfp_kernels.ExponentiatedQuadratic(amplitude=tf.squeeze(rv_amp_1.sample(1)),
                                              length_scale=tf.squeeze(rv_scale_1.sample(1)),
                                              feature_ndims=2,
                                              name='Exp_kernel_1')
print(kernel_1.batch_shape)
gp_1 = tfd.GaussianProcess(kernel=kernel_1,
                           index_points=input_signal,
                           observation_noise_variance=0.1,
                           name='gp_1')

sample_1 = gp_1.sample(1)
print(sample_1.shape)
print(gp_1.covariance())
print(gp_1.log_prob(sample_1))

Это работает и дает мне следующий результат: kernel_1.batch_shape = (5, 3), sample_1.shape = (1, 5, 3, 120), gp_1.covariance().shape = (5, 3, 120, 120) и gp_1.log_prob(sample_1).shape = (1, 5, 3).

Однако, если я хочу изменить index_point.shape = (10, 120, 5, 3), оставив все то же самое. Консоль python выдает кучу сообщений об ошибках следующим образом. Моя ожидаемая форма вывода kernel_1.batch_shape = (5, 3), sample_1.shape = (1, 10, 5, 3, 120), gp_1.covariance().shape = (10, 5, 3, 120, 120), gp_1.log_prob(sample_1).shape = (1, 10, 5, 3). (Не уверен, что это правильный порядок, но он должен содержать 10 в кортеже)

Traceback (most recent call last):
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow/python/framework/ops.py", line 1659, in _create_c_op
    c_op = c_api.TF_FinishOperation(op_desc)
tensorflow.python.framework.errors_impl.InvalidArgumentError: Dimensions must be equal, but are 10 and 3 for 'Exp_kernel_1_44/truediv' (op: 'RealDiv') with input shapes: [10,120,120], [5,3,1,1].
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "<input>", line 56, in <module>
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow_probability/python/distributions/gaussian_process.py", line 270, in __init__
    kernel.matrix(self.index_points, self.index_points),
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow_probability/python/positive_semidefinite_kernels/positive_semidefinite_kernel.py", line 550, in matrix
    return self._apply(x1, x2, param_expansion_ndims=2)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow_probability/python/positive_semidefinite_kernels/exponentiated_quadratic.py", line 118, in _apply
    exponent /= length_scale**2
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow/python/ops/math_ops.py", line 812, in binary_op_wrapper
    return func(x, y, name=name)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow/python/ops/math_ops.py", line 920, in _truediv_python3
    return gen_math_ops.real_div(x, y, name=name)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow/python/ops/gen_math_ops.py", line 6897, in real_div
    "RealDiv", x=x, y=y, name=name)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow/python/framework/op_def_library.py", line 788, in _apply_op_helper
    op_def=op_def)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow/python/util/deprecation.py", line 507, in new_func
    return func(*args, **kwargs)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow/python/framework/ops.py", line 3300, in create_op
    op_def=op_def)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow/python/framework/ops.py", line 1823, in __init__
    control_input_ops)
  File "/MMAR_q/venv/lib/python3.7/site-packages/tensorflow/python/framework/ops.py", line 1662, in _create_c_op
    raise ValueError(str(e))
ValueError: Dimensions must be equal, but are 10 and 3 for 'Exp_kernel_1_44/truediv' (op: 'RealDiv') with input shapes: [10,120,120], [5,3,1,1].

По сути, я просто хочу обобщить входные индексные точки с помощью дополнительного измерения партии, как вводит https://www.tensorflow.org/probability/api_docs/python/tfp/distributions/GaussianProcess. Но похоже, что мои текущие настройки допускают только самое левое измерение как e без дополнительных b1, ..., bB.

Кто-нибудь знает, как справиться с такой векторизованной ситуацией с gp-фиттингом?

Заранее спасибо.

...