'Compute loss and also deriv w.r.t to it if asked for.
Compute the loss function. Targets should be in self.data, predictions
should be in self.state.
Args:
get_deriv: If True, compute the derivative w.r.t the loss function and put
it in self.deriv.'

def GetLoss(self, get_deriv=False, acc_deriv=False, **kwargs):

    perf = deepnet_pb2.Metrics()
    perf.MergeFrom(self.proto.performance_stats)
    perf.count = self.batchsize
    tiny = self.tiny
    if (self.loss_function == deepnet_pb2.Layer.CROSS_ENTROPY):
        data = self.data
        state = self.state
        temp1 = self.statesize
        cm.cross_entropy_bernoulli(data, state, target=temp1, tiny=self.tiny)
        perf.cross_entropy = temp1.sum()
        cm.correct_preds(data, state, target=temp1, cutoff=0.5)
        perf.correct_preds = temp1.sum()
        if get_deriv:
            self.state.subtract(self.data, target=self.deriv)
    elif (self.loss_function == deepnet_pb2.Layer.SQUARED_LOSS):
        target = self.statesize
        self.state.subtract(self.data, target=target)
        error = (target.euclid_norm() ** 2)
        perf.error = error
        if acc_deriv:
            self.deriv.add_mult(target, alpha=self.loss_weight)
        else:
            self.deriv.assign(target)
        if get_deriv:
            self.ComputeDeriv()
    else:
        raise Exception('Unknown    loss    function    for    logistic    units.')
    return perf
