def l2(tt): """Applies l2 regularization to TensorTrain object.""" with tf.name_scope(scope, 'l2_regularizer', [tt]) as name: my_scale = tf.convert_to_tensor(scale, dtype=tt.dtype.base_dtype, name='scale') return tf.mul(my_scale, ops.frobenius_norm_squared(tt), name=name)
def testFrobeniusNormDifferentiableBatch(self): with self.test_session() as sess: tt = initializers.random_tensor_batch((3, 3, 3), tt_rank=2, batch_size=5, dtype=self.dtype) norm_sq_diff = ops.frobenius_norm_squared(tt, differentiable=True) variables = [norm_sq_diff, ops.full(tt)] norm_sq_diff_val, tt_full = sess.run(variables) desired_norm = np.linalg.norm(tt_full.reshape((5, -1)), axis=1)**2 self.assertAllClose(norm_sq_diff_val, desired_norm, atol=1e-5, rtol=1e-5)
def testFrobeniusNormTens(self): # Frobenius norm of a batch of TT-tensors. with self.test_session() as sess: tt = initializers.tensor_batch_with_random_cores((2, 1, 3), batch_size=3, dtype=self.dtype) norm_sq_actual = ops.frobenius_norm_squared(tt) norm_actual = ops.frobenius_norm(tt) vars = [norm_sq_actual, norm_actual, ops.full(tt)] norm_sq_actual_val, norm_actual_val, tt_val = sess.run(vars) tt_val = tt_val.reshape((3, -1)) norm_sq_desired_val = np.sum(tt_val * tt_val, axis=1) norm_desired_val = np.sqrt(norm_sq_desired_val) self.assertAllClose(norm_sq_actual_val, norm_sq_desired_val) self.assertAllClose(norm_actual_val, norm_desired_val, atol=1e-5, rtol=1e-5)
def testToAndFromDeltas(self): # Test converting to and from deltas representation of the tangent space # element. what = initializers.random_tensor((2, 3, 4), 4, dtype=self.dtype) where = initializers.random_tensor((2, 3, 4), 3, dtype=self.dtype) projected = riemannian.project(what, where) deltas = riemannian.tangent_space_to_deltas(projected) reconstructed_projected = riemannian.deltas_to_tangent_space(deltas, where) # Tangent space element norm can be computed from deltas norm. projected_normsq_desired = ops.frobenius_norm_squared(projected) projected_normsq_actual = tf.add_n([tf.reduce_sum(c * c) for c in deltas]) desired_val, actual_val = self.evaluate((ops.full(projected), ops.full(reconstructed_projected))) self.assertAllClose(desired_val, actual_val) desired_val, actual_val = self.evaluate((projected_normsq_desired, projected_normsq_actual)) self.assertAllClose(desired_val, actual_val)
def testFrobeniusNormMatrix(self): # Frobenius norm of a TT-matrix. shape_list = (((2, 2), (3, 4)), ((2, 3, 4), (2, 2, 2))) rank_list = (1, 2) with self.test_session() as sess: for tensor_shape in shape_list: for rank in rank_list: tt = initializers.random_matrix(tensor_shape, tt_rank=rank, dtype=self.dtype) norm_sq_actual = ops.frobenius_norm_squared(tt) norm_actual = ops.frobenius_norm(tt) vars = [norm_sq_actual, norm_actual, ops.full(tt)] norm_sq_actual_val, norm_actual_val, tt_val = sess.run(vars) tt_val = tt_val.flatten() norm_sq_desired_val = tt_val.dot(tt_val) norm_desired_val = np.linalg.norm(tt_val) self.assertAllClose(norm_sq_actual_val, norm_sq_desired_val) self.assertAllClose(norm_actual_val, norm_desired_val, atol=1e-5, rtol=1e-5)
def testToAndFromDeltasBatch(self): # Test converting to and from deltas representation of the tangent space # element in the batch case. what = initializers.random_matrix_batch(((2, 3, 4), (3, 3, 3)), 4, batch_size=3, dtype=self.dtype) where = initializers.random_matrix(((2, 3, 4), (3, 3, 3)), 3, dtype=self.dtype) projected = riemannian.project(what, where) deltas = riemannian.tangent_space_to_deltas(projected) reconstructed_projected = riemannian.deltas_to_tangent_space(deltas, where) # Tangent space element norm can be computed from deltas norm. projected_normsq_desired = ops.frobenius_norm_squared(projected) d_normssq = [tf.reduce_sum(tf.reshape(c, (3, -1)) ** 2, 1) for c in deltas] projected_normsq_actual = tf.add_n(d_normssq) desired_val, actual_val = self.evaluate((ops.full(projected), ops.full(reconstructed_projected))) self.assertAllClose(desired_val, actual_val) desired_val, actual_val = self.evaluate((projected_normsq_desired, projected_normsq_actual)) self.assertAllClose(desired_val, actual_val)
def testFrobeniusNormTens(self): # Frobenius norm of a TT-tensor. shape_list = ((2, 2), (2, 3, 4), (4, 2, 5, 2)) rank_list = (1, 2) for shape in shape_list: for rank in rank_list: tt = initializers.random_tensor(shape, tt_rank=rank, dtype=self.dtype) norm_sq_actual = ops.frobenius_norm_squared(tt) norm_actual = ops.frobenius_norm(tt, epsilon=0.0) vars = [norm_sq_actual, norm_actual, ops.full(tt)] norm_sq_actual_val, norm_actual_val, tt_val = self.evaluate( vars) tt_val = tt_val.flatten() norm_sq_desired_val = tt_val.dot(tt_val) norm_desired_val = np.linalg.norm(tt_val) self.assertAllClose(norm_sq_actual_val, norm_sq_desired_val) self.assertAllClose(norm_actual_val, norm_desired_val, atol=1e-5, rtol=1e-5)