def loss(y_pred, y_true, metric=SO3.bi_invariant_metric, representation="vector"): """Loss function given by a Riemannian metric on a Lie group. Parameters ---------- y_pred : array-like Prediction on SO(3). y_true : array-like Ground-truth on SO(3). metric : RiemannianMetric Metric used to compute the loss and gradient. representation : str, {'vector', 'matrix'} Representation chosen for points in SO(3). Returns ------- lie_loss : array-like Loss using the Riemannian metric. """ if representation == "quaternion": y_pred = SO3.rotation_vector_from_quaternion(y_pred) y_true = SO3.rotation_vector_from_quaternion(y_true) lie_loss = lie_group.loss(y_pred, y_true, SO3, metric) return lie_loss
def loss(y_pred, y_true, metric=SO3.bi_invariant_metric, representation='vector'): if representation == 'quaternion': y_pred = SO3.rotation_vector_from_quaternion(y_pred) y_true = SO3.rotation_vector_from_quaternion(y_true) loss = lie_group.loss(y_pred, y_true, SO3, metric) return loss
def loss(y_pred, y_true, metric=SE3.left_canonical_metric, representation='vector'): """ Loss function given by a riemannian metric on a Lie group, by default the left-invariant canonical metric. """ if gs.ndim(y_pred) == 1: y_pred = gs.expand_dims(y_pred, axis=0) if gs.ndim(y_true) == 1: y_true = gs.expand_dims(y_true, axis=0) if representation == 'quaternion': y_pred_rot_vec = SO3.rotation_vector_from_quaternion(y_pred[:, :4]) y_pred = gs.hstack([y_pred_rot_vec, y_pred[:, 4:]]) y_true_rot_vec = SO3.rotation_vector_from_quaternion(y_true[:, :4]) y_true = gs.hstack([y_true_rot_vec, y_true[:, 4:]]) loss = lie_group.loss(y_pred, y_true, SE3, metric) return loss
def loss(y_pred, y_true, metric=SE3.left_canonical_metric, representation='vector'): """Loss function given by a Riemannian metric on a Lie group. Parameters ---------- y_pred : array-like Prediction on SE(3). y_true : array-like Ground-truth on SE(3). metric : RiemannianMetric Metric used to compute the loss and gradient. representation : str, {'vector', 'matrix'} Representation chosen for points in SE(3). Returns ------- lie_loss : array-like Loss using the Riemannian metric. """ if gs.ndim(y_pred) == 1: y_pred = gs.expand_dims(y_pred, axis=0) if gs.ndim(y_true) == 1: y_true = gs.expand_dims(y_true, axis=0) if representation == 'quaternion': y_pred_rot_vec = SO3.rotation_vector_from_quaternion(y_pred[:, :4]) y_pred = gs.hstack([y_pred_rot_vec, y_pred[:, 4:]]) y_true_rot_vec = SO3.rotation_vector_from_quaternion(y_true[:, :4]) y_true = gs.hstack([y_true_rot_vec, y_true[:, 4:]]) lie_loss = lie_group.loss(y_pred, y_true, SE3, metric) if gs.ndim(lie_loss) == 2: lie_loss = gs.squeeze(lie_loss, axis=1) if gs.ndim(lie_loss) == 1 and gs.shape(lie_loss)[0] == 1: lie_loss = gs.squeeze(lie_loss, axis=0) return lie_loss