[16dd74]: / dsb2018_topcoders / selim / losses.py

Download this file

74 lines (51 with data), 2.6 kB

 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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import keras.backend as K
from keras.losses import categorical_crossentropy
def hard_dice_coef(y_true, y_pred, smooth=1e-3):
y_true_f = K.flatten(K.round(y_true[..., 0]))
y_pred_f = K.flatten(K.round(y_pred[..., 0]))
intersection = K.sum(y_true_f * y_pred_f)
return 100. * (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
def hard_dice_coef_ch1(y_true, y_pred, smooth=1e-3):
y_true_f = K.flatten(K.round(y_true[..., 1]))
y_pred_f = K.flatten(K.round(y_pred[..., 1]))
intersection = K.sum(y_true_f * y_pred_f)
return 100. * (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
def dice_coef(y_true, y_pred, smooth=1e-3):
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
intersection = K.sum(y_true_f * y_pred_f)
return K.mean((2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth))
def dice_coef_loss(y_true, y_pred):
return 1 - dice_coef(y_true, y_pred)
def dice_coef_loss_bce(y_true, y_pred, dice=0.5, bce=0.5):
return binary_crossentropy(y_true, y_pred) * bce + dice_coef_loss(y_true, y_pred) * dice
def binary_crossentropy(y, p):
return K.mean(K.binary_crossentropy(y, p))
def double_head_loss(y_true, y_pred):
mask_loss = dice_coef_loss_bce(y_true[..., 0], y_pred[..., 0])
contour_loss = dice_coef_loss_bce(y_true[..., 1], y_pred[..., 1])
return mask_loss + contour_loss
def mask_contour_mask_loss(y_true, y_pred):
mask_loss = dice_coef_loss_bce(y_true[..., 0], y_pred[..., 0])
contour_loss = dice_coef_loss_bce(y_true[..., 1], y_pred[..., 1])
full_mask = dice_coef_loss_bce(y_true[..., 2], y_pred[..., 2])
return mask_loss + 2 * contour_loss + full_mask
def softmax_dice_loss(y_true, y_pred):
return categorical_crossentropy(y_true, y_pred) * 0.6 + dice_coef_loss(y_true[..., 0], y_pred[..., 0]) * 0.2 + dice_coef_loss(y_true[..., 1], y_pred[..., 1]) * 0.2
def make_loss(loss_name):
if loss_name == 'bce_dice':
def loss(y, p):
return dice_coef_loss_bce(y, p, dice=0.5, bce=0.5)
return loss
elif loss_name == 'bce':
def loss(y, p):
return dice_coef_loss_bce(y, p, dice=0, bce=1)
return loss
elif loss_name == 'categorical_dice':
return softmax_dice_loss
elif loss_name == 'double_head_loss':
return double_head_loss
elif loss_name == 'mask_contour_mask_loss':
return mask_contour_mask_loss
else:
ValueError("Unknown loss.")