'Compute scalar loss tensors with respect to provided groundtruth.
Calling this function requires that groundtruth tensors have been
provided via the provide_groundtruth function.
Args:
prediction_dict: a dictionary holding predicted tensors
Returns:
a dictionary mapping strings (loss names) to scalar tensors representing
loss values.'

def loss(self, prediction_dict):

    batch_reg_targets = tf.stack(self.groundtruth_lists(fields.BoxListFields.boxes))
    batch_cls_targets = tf.stack(self.groundtruth_lists(fields.BoxListFields.classes))
    weights = tf.constant(1.0, dtype=tf.float32, shape=[len(self.groundtruth_lists(fields.BoxListFields.boxes)), 1])
    location_losses = self._localization_loss(prediction_dict['box_encodings'], batch_reg_targets, weights=weights)
    cls_losses = self._classification_loss(prediction_dict['class_predictions_with_background'], batch_cls_targets, weights=weights)
    loss_dict = {'localization_loss': tf.reduce_sum(location_losses), 'classification_loss': tf.reduce_sum(cls_losses)}
    return loss_dict
