As you can see from the following code/output SVI in deep GPs produces a mismatch in dimensions (number of samples vs 1), some broadcast seems to fail presumably?
import numpy as np, mxnet as mx
from mxfusion import Model, Variable
from mxfusion.modules.gp_modules import SparseGPRegression
from mxfusion.components.distributions.gp.kernels import RBF, White
from mxfusion.inference import GradBasedInference, create_Gaussian_meanfield, StochasticVariationalInference
from mxfusion.components.variables.var_trans import PositiveTransformation
X = np.random.uniform(-3.,3.,(20,1))
Y = np.sin(X) + np.random.randn(20,1)*0.05
m = Model()
m.x = Variable(shape=(20, 1))
m.noise_var = Variable(transformation=PositiveTransformation())
kernel = RBF(input_dim=1, dtype='float64') + White(input_dim=1, dtype='float64')
m.y = SparseGPRegression.define_variable(X=m.x, kernel=kernel, shape=(20, 1),
noise_var=m.noise_var, dtype='float64')
m.noise_var_z = Variable(transformation=PositiveTransformation())
kernel_z = RBF(input_dim=1, variance=1., lengthscale=1., dtype='float64')+ White(input_dim=1, dtype='float64')
m.z = SparseGPRegression.define_variable(X=m.y, kernel=kernel_z, shape=(20, 1),
noise_var=m.noise_var_z, dtype='float64')
q = create_Gaussian_meanfield(model=m, observed=[m.x, m.z], dtype='float64')
infr = GradBasedInference(inference_algorithm=StochasticVariationalInference(model=m, posterior=q, num_samples=100, observed=[m.z]), dtype='float64')
infr.run(x=mx.nd.array(X, dtype='float64'), z=mx.nd.array(Y, dtype='float64'), learning_rate=0.05, verbose=True, max_iter=100)
---------------------------------------------------------------------------
MXNetError Traceback (most recent call last)
<ipython-input-19-58fc005b39b5> in <module>()
24 q = create_Gaussian_meanfield(model=m, observed=[m.x, m.z], dtype='float64')
25 infr = GradBasedInference(inference_algorithm=StochasticVariationalInference(model=m, posterior=q, num_samples=100, observed=[m.z]), dtype='float64')
---> 26 infr.run(x=mx.nd.array(X, dtype='float64'), z=mx.nd.array(Y, dtype='float64'), learning_rate=0.05, verbose=True, max_iter=100)
MXFusion/mxfusion/inference/grad_based_inference.py in run(self, optimizer, learning_rate, max_iter, verbose, **kw)
75 infr_executor=infr, data=data, param_dict=self.params.param_dict,
76 ctx=self.mxnet_context, optimizer=optimizer,
---> 77 learning_rate=learning_rate, max_iter=max_iter, verbose=verbose)
MXFusion/mxfusion/inference/batch_loop.py in run(self, infr_executor, data, param_dict, ctx, optimizer, learning_rate, max_iter, n_prints, verbose)
35 for i in range(max_iter):
36 with mx.autograd.record():
---> 37 loss, loss_for_gradient = infr_executor(mx.nd.zeros(1, ctx=ctx), *data)
38 loss_for_gradient.backward()
39 if verbose:
mxnet/gluon/block.py in __call__(self, *args)
539 hook(self, args)
540
--> 541 out = self.forward(*args)
542
543 for hook in self._forward_hooks.values():
mxnet/gluon/block.py in forward(self, x, *args)
916 params = {i: j.data(ctx) for i, j in self._reg_params.items()}
917
--> 918 return self.hybrid_forward(ndarray, x, *args, **params)
919
920 assert isinstance(x, Symbol), \
MXFusion/mxfusion/inference/inference_alg.py in hybrid_forward(self, F, x, *args, **kw)
65 add_sample_dimension_to_arrays(F, kw, out=variables)
66 add_sample_dimension_to_arrays(F, self._constants, out=variables)
---> 67 obj = self._infr_method.compute(F=F, variables=variables)
68 with autograd.pause():
69 # An inference algorithm may directly set the value of a parameter instead of computing its gradient.
MXFusion/mxfusion/inference/variational.py in compute(self, F, variables)
91 F=F, variables=variables, num_samples=self.num_samples)
92 variables.update(samples)
---> 93 logL = self.model.log_pdf(F=F, variables=variables)
94 logL = logL - self.posterior.log_pdf(F=F, variables=variables)
95 return -logL, -logL
MXFusion/mxfusion/models/factor_graph.py in log_pdf(self, F, variables, targets)
211 if len(module_targets) > 0:
212 logL = logL + F.sum(expectation(F, f.log_pdf(
--> 213 F=F, variables=variables, targets=module_targets)))
214 else:
215 raise ModelSpecificationError("There is an object in the factor graph that isn't a factor." + "That shouldn't happen.")
MXFusion/mxfusion/modules/module.py in log_pdf(self, F, variables, targets)
295 else:
296 raise ModelSpecificationError("The targets, conditionals pattern for log_pdf computation "+str((target_names, conditionals_names))+" cannot find a matched inference algorithm.")
--> 297 return alg.compute(F, variables)
298
299 def draw_samples(self, F, variables, num_samples=1, targets=None):
MXFusion/mxfusion/modules/gp_modules/sparsegp_regression.py in compute(self, F, variables)
47 mean = self.model.mean_func(F, X)
48 Y = Y - mean
---> 49 LAInvLinvKufY = F.linalg.trsm(LA, F.linalg.gemm2(LinvKuf, Y))
50
51 logL = - D*F.linalg.sumlogdiag(LA)
mxnet/ndarray/register.py in gemm2(A, B, transpose_a, transpose_b, alpha, axis, out, name, **kwargs)
mxnet/_ctypes/ndarray.py in _imperative_invoke(handle, ndargs, keys, vals, out)
90 c_str_array(keys),
91 c_str_array([str(s) for s in vals]),
---> 92 ctypes.byref(out_stypes)))
93
94 if original_output is not None:
mxnet/base.py in check_call(ret)
250 """
251 if ret != 0:
--> 252 raise MXNetError(py_str(_LIB.MXGetLastError()))
253
254
MXNetError: [11:40:59] src/operator/tensor/./la_op.h:144: Check failed: (*in_attrs)[0][i] == (*in_attrs)[1][i] (1 vs. 100) Shapes of inputs 0, 1 must be the same, except on row/col axis
Stack trace returned 8 entries:
[bt] (0) 0 libmxnet.so 0x00000001142c4b90 libmxnet.so + 15248
[bt] (1) 1 libmxnet.so 0x00000001142c493f libmxnet.so + 14655
[bt] (2) 2 libmxnet.so 0x000000011552970b libmxnet.so + 19302155
[bt] (3) 3 libmxnet.so 0x00000001157f94ca MXNDListFree + 502922
[bt] (4) 4 libmxnet.so 0x00000001157f7f94 MXNDListFree + 497492
[bt] (5) 5 libmxnet.so 0x000000011575530e MXCustomFunctionRecord + 20926
[bt] (6) 6 libmxnet.so 0x0000000115756030 MXImperativeInvokeEx + 176
[bt] (7) 7 _ctypes.cpython-35m-darwin.so 0x000000010cd69627 ffi_call_unix64 + 79