Skip to content

Commit

Permalink
update custom loss with normFac
Browse files Browse the repository at this point in the history
  • Loading branch information
jmduarte committed Dec 19, 2023
1 parent 449c223 commit 5468221
Showing 1 changed file with 60 additions and 55 deletions.
115 changes: 60 additions & 55 deletions loss.py
Original file line number Diff line number Diff line change
@@ -1,58 +1,63 @@
def custom_loss(y_true, y_pred):
def custom_loss_wrapper(normFac=1):
'''
cutmoized loss function to improve the recoil response,
customized loss function to improve the recoil response,
by balancing the response above one and below one
'''
import tensorflow.keras.backend as K
import tensorflow as tf

px_truth = K.flatten(y_true[:, 0])
py_truth = K.flatten(y_true[:, 1])
px_pred = K.flatten(y_pred[:, 0])
py_pred = K.flatten(y_pred[:, 1])

pt_truth = K.sqrt(px_truth*px_truth + py_truth*py_truth)

#px_truth1 = px_truth / pt_truth
#py_truth1 = py_truth / pt_truth

# using absolute response
# upar_pred = (px_truth1 * px_pred + py_truth1 * py_pred)/pt_truth
upar_pred = K.sqrt(px_pred * px_pred + py_pred * py_pred) - pt_truth
pt_cut = pt_truth > 0.
upar_pred = tf.boolean_mask(upar_pred, pt_cut)
pt_truth_filtered = tf.boolean_mask(pt_truth, pt_cut)

#filter_bin0 = pt_truth_filtered < 50.
filter_bin0 = tf.logical_and(pt_truth_filtered > 50., pt_truth_filtered < 100.)
filter_bin1 = tf.logical_and(pt_truth_filtered > 100., pt_truth_filtered < 200.)
filter_bin2 = tf.logical_and(pt_truth_filtered > 200., pt_truth_filtered < 300.)
filter_bin3 = tf.logical_and(pt_truth_filtered > 300., pt_truth_filtered < 400.)
filter_bin4 = pt_truth_filtered > 400.

upar_pred_pos_bin0 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin0, upar_pred > 0.))
upar_pred_neg_bin0 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin0, upar_pred < 0.))
upar_pred_pos_bin1 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin1, upar_pred > 0.))
upar_pred_neg_bin1 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin1, upar_pred < 0.))
upar_pred_pos_bin2 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin2, upar_pred > 0.))
upar_pred_neg_bin2 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin2, upar_pred < 0.))
upar_pred_pos_bin3 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin3, upar_pred > 0.))
upar_pred_neg_bin3 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin3, upar_pred < 0.))
upar_pred_pos_bin4 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin4, upar_pred > 0.))
upar_pred_neg_bin4 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin4, upar_pred < 0.))
#upar_pred_pos_bin5 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin5, upar_pred > 0.))
#upar_pred_neg_bin5 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin5, upar_pred < 0.))
norm = tf.reduce_sum(pt_truth_filtered)
dev = tf.abs(tf.reduce_sum(upar_pred_pos_bin0) + tf.reduce_sum(upar_pred_neg_bin0))
dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin1) + tf.reduce_sum(upar_pred_neg_bin1))
dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin2) + tf.reduce_sum(upar_pred_neg_bin2))
dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin3) + tf.reduce_sum(upar_pred_neg_bin3))
dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin4) + tf.reduce_sum(upar_pred_neg_bin4))
#dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin5) + tf.reduce_sum(upar_pred_neg_bin5))
dev /= norm

loss = 0.5*K.mean((px_pred - px_truth)**2 + (py_pred - py_truth)**2)

#loss += 200.*dev
loss += 5000.*dev
return loss


def custom_loss(y_true, y_pred):
import tensorflow.keras.backend as K
import tensorflow as tf

px_truth = K.flatten(y_true[:, 0])
py_truth = K.flatten(y_true[:, 1])
px_pred = K.flatten(y_pred[:, 0])
py_pred = K.flatten(y_pred[:, 1])

pt_truth = K.sqrt(px_truth*px_truth + py_truth*py_truth)

#px_truth1 = px_truth / pt_truth
#py_truth1 = py_truth / pt_truth

# using absolute response
# upar_pred = (px_truth1 * px_pred + py_truth1 * py_pred)/pt_truth
upar_pred = K.sqrt(px_pred * px_pred + py_pred * py_pred) - pt_truth
pt_cut = pt_truth > 0.
upar_pred = tf.boolean_mask(upar_pred, pt_cut)
pt_truth_filtered = tf.boolean_mask(pt_truth, pt_cut)

#filter_bin0 = pt_truth_filtered < 50./normFac
filter_bin0 = tf.logical_and(pt_truth_filtered > 50./normFac, pt_truth_filtered < 100./normFac)
filter_bin1 = tf.logical_and(pt_truth_filtered > 100./normFac, pt_truth_filtered < 200./normFac)
filter_bin2 = tf.logical_and(pt_truth_filtered > 200./normFac, pt_truth_filtered < 300./normFac)
filter_bin3 = tf.logical_and(pt_truth_filtered > 300./normFac, pt_truth_filtered < 400./normFac)
filter_bin4 = pt_truth_filtered > 400./normFac

upar_pred_pos_bin0 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin0, upar_pred > 0.))
upar_pred_neg_bin0 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin0, upar_pred < 0.))
upar_pred_pos_bin1 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin1, upar_pred > 0.))
upar_pred_neg_bin1 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin1, upar_pred < 0.))
upar_pred_pos_bin2 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin2, upar_pred > 0.))
upar_pred_neg_bin2 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin2, upar_pred < 0.))
upar_pred_pos_bin3 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin3, upar_pred > 0.))
upar_pred_neg_bin3 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin3, upar_pred < 0.))
upar_pred_pos_bin4 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin4, upar_pred > 0.))
upar_pred_neg_bin4 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin4, upar_pred < 0.))
#upar_pred_pos_bin5 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin5, upar_pred > 0.))
#upar_pred_neg_bin5 = tf.boolean_mask(upar_pred, tf.logical_and(filter_bin5, upar_pred < 0.))
norm = tf.reduce_sum(pt_truth_filtered)
dev = tf.abs(tf.reduce_sum(upar_pred_pos_bin0) + tf.reduce_sum(upar_pred_neg_bin0))
dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin1) + tf.reduce_sum(upar_pred_neg_bin1))
dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin2) + tf.reduce_sum(upar_pred_neg_bin2))
dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin3) + tf.reduce_sum(upar_pred_neg_bin3))
dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin4) + tf.reduce_sum(upar_pred_neg_bin4))
#dev += tf.abs(tf.reduce_sum(upar_pred_pos_bin5) + tf.reduce_sum(upar_pred_neg_bin5))
dev /= norm

loss = 0.5*normFac**2*K.mean((px_pred - px_truth)**2 + (py_pred - py_truth)**2)

#loss += 200.*dev
loss += 5000.*dev
return loss

return custom_loss

0 comments on commit 5468221

Please sign in to comment.