Skip to content

Commit 8a780c4

Browse files
committed
Add losses and metrics
1 parent 0110bc3 commit 8a780c4

File tree

2 files changed

+77
-0
lines changed

2 files changed

+77
-0
lines changed

losses.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from metrics import dice_coefficient, tversky
2+
from tensorflow.keras.losses import binary_crossentropy
3+
4+
5+
def dice_loss(y_true, y_pred):
6+
loss = 1 - dice_coefficient(y_true, y_pred)
7+
return loss
8+
9+
10+
def bce_dice_loss(y_true, y_pred):
11+
loss = binary_crossentropy(y_true, y_pred) + dice_loss(y_true, y_pred)
12+
return loss
13+
14+
15+
def tversky_loss(y_true, y_pred):
16+
return 1 - tversky(y_true,y_pred)
17+
18+
19+
def focal_tversky(y_true, y_pred, gamma=0.75):
20+
pt_1 = tversky(y_true, y_pred)
21+
return K.pow((1-pt_1), gamma)

metrics.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from tensorflow.keras import backend as K
2+
3+
smooth = 1.
4+
5+
def dice_coefficient(y_true, y_pred):
6+
y_true_f = K.flatten(y_true)
7+
y_pred_f = K.flatten(y_pred)
8+
intersection = K.sum(y_true_f * y_pred_f)
9+
score = (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
10+
return score
11+
12+
13+
def confusion(y_true, y_pred):
14+
y_pred_pos = K.clip(y_pred, 0, 1)
15+
y_pred_neg = 1 - y_pred_pos
16+
y_pos = K.clip(y_true, 0, 1)
17+
y_neg = 1 - y_pos
18+
tp = K.sum(y_pos * y_pred_pos)
19+
fp = K.sum(y_neg * y_pred_pos)
20+
fn = K.sum(y_pos * y_pred_neg)
21+
prec = (tp + smooth)/(tp+fp+smooth)
22+
rec = (tp+smooth)/(tp+fn+smooth)
23+
return prec, rec
24+
25+
26+
def recall(y_true, y_pred):
27+
y_pred_pos = K.clip(y_pred, 0, 1)
28+
y_pred_neg = 1 - y_pred_pos
29+
y_pos = K.clip(y_true, 0, 1)
30+
y_neg = 1 - y_pos
31+
tp = K.sum(y_pos * y_pred_pos)
32+
fp = K.sum(y_neg * y_pred_pos)
33+
fn = K.sum(y_pos * y_pred_neg)
34+
rec = (tp+smooth)/(tp+fn+smooth)
35+
return rec
36+
37+
38+
def precision(y_true, y_pred):
39+
y_pred_pos = K.clip(y_pred, 0, 1)
40+
y_pred_neg = 1 - y_pred_pos
41+
y_pos = K.clip(y_true, 0, 1)
42+
y_neg = 1 - y_pos
43+
tp = K.sum(y_pos * y_pred_pos)
44+
fp = K.sum(y_neg * y_pred_pos)
45+
fn = K.sum(y_pos * y_pred_neg)
46+
prec = (tp + smooth)/(tp+fp+smooth)
47+
return prec
48+
49+
50+
def tversky(y_true, y_pred, alpha=0.7):
51+
y_true_pos = K.flatten(y_true)
52+
y_pred_pos = K.flatten(y_pred)
53+
true_pos = K.sum(y_true_pos * y_pred_pos)
54+
false_neg = K.sum(y_true_pos * (1-y_pred_pos))
55+
false_pos = K.sum((1-y_true_pos)*y_pred_pos)
56+
return (true_pos + smooth)/(true_pos + alpha*false_neg + (1-alpha)*false_pos + smooth)

0 commit comments

Comments
 (0)