Я учусь приспосабливаться к гауссовскому процессу, используя тензор-вероятность. Поскольку моя модель требует установки множества 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-фиттингом?
Заранее спасибо.