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#
\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