aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/contrib/distributions
diff options
context:
space:
mode:
authorGravatar A. Unique TensorFlower <gardener@tensorflow.org>2018-06-20 15:46:24 -0700
committerGravatar TensorFlower Gardener <gardener@tensorflow.org>2018-06-20 15:49:46 -0700
commit185b862db1cda8f99e719b4f287c6c1eba1c2f73 (patch)
treeb0a89d456201f157b3554d9f3df0750dbae8d410 /tensorflow/contrib/distributions
parent89045abeddfa4afc9089c8d93d9d22e33d7fe369 (diff)
Fix CholeskyOuterProduct to return scalar determinant with single matrix inputs.
PiperOrigin-RevId: 201431010
Diffstat (limited to 'tensorflow/contrib/distributions')
-rw-r--r--tensorflow/contrib/distributions/python/kernel_tests/bijectors/cholesky_outer_product_test.py22
-rw-r--r--tensorflow/contrib/distributions/python/ops/bijectors/cholesky_outer_product.py15
2 files changed, 36 insertions, 1 deletions
diff --git a/tensorflow/contrib/distributions/python/kernel_tests/bijectors/cholesky_outer_product_test.py b/tensorflow/contrib/distributions/python/kernel_tests/bijectors/cholesky_outer_product_test.py
index e281e81bdf..d1ce273499 100644
--- a/tensorflow/contrib/distributions/python/kernel_tests/bijectors/cholesky_outer_product_test.py
+++ b/tensorflow/contrib/distributions/python/kernel_tests/bijectors/cholesky_outer_product_test.py
@@ -61,6 +61,28 @@ class CholeskyOuterProductBijectorTest(test.TestCase):
atol=0.,
rtol=1e-7)
+ def testNoBatchStaticJacobian(self):
+ x = np.eye(2)
+ bijector = bijectors.CholeskyOuterProduct()
+
+ # The Jacobian matrix is 2 * tf.eye(2), which has jacobian determinant 4.
+ self.assertAllClose(
+ np.log(4),
+ self.evaluate(bijector.forward_log_det_jacobian(x, event_ndims=2)))
+
+ def testNoBatchDynamicJacobian(self):
+ x = np.eye(2)
+ bijector = bijectors.CholeskyOuterProduct()
+ x_pl = array_ops.placeholder(dtypes.float32)
+
+ with self.test_session():
+ log_det_jacobian = bijector.forward_log_det_jacobian(x_pl, event_ndims=2)
+
+ # The Jacobian matrix is 2 * tf.eye(2), which has jacobian determinant 4.
+ self.assertAllClose(
+ np.log(4),
+ log_det_jacobian.eval({x_pl: x}))
+
def testNoBatchStatic(self):
x = np.array([[1., 0], [2, 1]]) # np.linalg.cholesky(y)
y = np.array([[1., 2], [2, 5]]) # np.matmul(x, x.T)
diff --git a/tensorflow/contrib/distributions/python/ops/bijectors/cholesky_outer_product.py b/tensorflow/contrib/distributions/python/ops/bijectors/cholesky_outer_product.py
index 8267ee7df8..3e1e4fc829 100644
--- a/tensorflow/contrib/distributions/python/ops/bijectors/cholesky_outer_product.py
+++ b/tensorflow/contrib/distributions/python/ops/bijectors/cholesky_outer_product.py
@@ -182,7 +182,20 @@ class CholeskyOuterProduct(bijector.Bijector):
axis=-1)
fldj = p_float * np.log(2.) + sum_weighted_log_diag
- return fldj
+ # We finally need to undo adding an extra column in non-scalar cases
+ # where there is a single matrix as input.
+ if x.get_shape().ndims is not None:
+ if x.get_shape().ndims == 2:
+ fldj = array_ops.squeeze(fldj, axis=-1)
+ return fldj
+
+ shape = array_ops.shape(fldj)
+ maybe_squeeze_shape = array_ops.concat([
+ shape[:-1],
+ distribution_util.pick_vector(
+ math_ops.equal(array_ops.rank(x), 2),
+ np.array([], dtype=np.int32), shape[-1:])], 0)
+ return array_ops.reshape(fldj, maybe_squeeze_shape)
def _make_columnar(self, x):
"""Ensures non-scalar input has at least one column.