Loss#

[30]:
class Loss(ABC):
    """Loss Meta class
    """
    @abstractmethod
    def __init__(self):
        pass

    @abstractmethod
    def forward(self):
        """mandatory method for child class
        """
        pass

    def calculate(self, output, y):
        """Calculate mean loss

        Args:
            output : output from the layer
            y : truth value/ target/ expected outcome
        """
        # it can be individual outcome of different kind of loss functions
        sample_losses = self.forward(output, y)

        # calculating mean
        data_loss = np.mean(sample_losses)
        return data_loss

Categorical Cross Entropy#

:nbsphinx-math:`begin{align}

L(a^{[l]},y) &= y log(a^{[l]}) + (1 - y) log(1 - a^{[l]})\ \ text{derivative of loss over a –> da}\ frac{partial L}{partial a} &= big[ frac{y}{a} + frac{1 -y}{1 - a}(-1) big]\ frac{partial L}{partial a} &= big[ frac{y}{a} - frac{1 -y}{1 - a} big]\ \ text{derivative of loss over z –> dz}\ frac{partial L}{partial z} &= frac{partial L}{partial a} frac{partial a}{partial z}\ \ text{derivative of loss over w –> dw}\ frac{partial L}{partial w} &= frac{partial L}{partial a} frac{partial a}{partial z} frac{partial z}{partial w} \ text{derivative of loss over b –> db}\ frac{partial L}{partial b} &= frac{partial L}{partial a} frac{partial a}{partial z} frac{partial z}{partial b}

end{align}`

  • y_pred_clipped

    • numpy.clip is used to clip the values from min and max values like bandpass filter

    • min = 1.0 * 10^-7

    • max = 1 - 1.0 * 10^-7

  • correct_confidences

    • probabilities for target value that has been

    • calculated earlier

    • only for categorical variables

[31]:
class LossCategoricalCrossEntropy(Loss):
    """Categorical Cross entropy loss
    """

    def forward(self, y_pred, y_true):
        """forward propogation calculation

        Args:
            y_pred (numpy.ndarray) : predictions generated
            y_true (numpy.ndarray) : actual values
        """

        # get total number of rows/samples
        samples = len(y_pred)


        y_pred_clipped = np.clip(y_pred,1e-7,1-1e-7)

        correct_confidences = None
        if len(y_true.shape) == 1:
            correct_confidences = y_pred_clipped[range(samples),y_true]

        elif len(y_true.shape) == 2:
            correct_confidences = np.sum(y_pred_clipped * y_true, axis = 1)

        else:
            pass

        # losses
        negative_log_Likelihoods = -np.log(correct_confidences)
        return negative_log_Likelihoods