Spaces:
Paused
Paused
File size: 1,837 Bytes
e6ed91e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | import tensorflow as tf
def weighted_binary_crossentropy(pos_weight):
"""
Function for giving more weight to the positive class (where the notes are being played)
"""
def loss(y_true, y_pred):
y_pred = tf.clip_by_value(y_pred, 1e-7, 1.0 - 1e-7)
loss_pos = -pos_weight * y_true * tf.math.log(y_pred)
loss_neg = -(1 - y_true) * tf.math.log(1 - y_pred)
loss = loss_pos + loss_neg
return tf.reduce_mean(loss)
return loss
def focal_loss(gamma=2.0, alpha=0.25):
def loss_fn(y_true, y_pred):
y_pred = tf.clip_by_value(y_pred, 1e-7, 1 - 1e-7)
bce = -y_true * tf.math.log(y_pred) - (1 - y_true) * tf.math.log(1 - y_pred)
p_t = (y_true * y_pred) + ((1 - y_true) * (1 - y_pred))
alpha_factor = y_true * alpha + (1 - y_true) * (1 - alpha)
modulating_factor = tf.pow(1.0 - p_t, gamma)
loss = alpha_factor * modulating_factor * bce
return tf.reduce_mean(loss)
return loss_fn
class F1Score(tf.keras.metrics.Metric):
def __init__(self, name='f1_score', threshold=0.3, **kwargs):
super(F1Score, self).__init__(name=name, **kwargs)
self.threshold = threshold
self.precision = tf.keras.metrics.Precision(thresholds=threshold)
self.recall = tf.keras.metrics.Recall(thresholds=threshold)
def update_state(self, y_true, y_pred, sample_weight=None):
self.precision.update_state(y_true, y_pred, sample_weight)
self.recall.update_state(y_true, y_pred, sample_weight)
def result(self):
p = self.precision.result()
r = self.recall.result()
return tf.math.divide_no_nan(2 * p * r, p + r)
def reset_states(self):
self.precision.reset_states()
self.recall.reset_states() |