уменьшение потерь так быстро, а другие метрики дают странное значение - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь использовать U-net с некоторой магистралью, такой как inceptionresnetv2, перезапустить, чтобы сегментировать с медицинским изображением из CT-Scan, и когда я начну тренировку, потеря станет около 0, как 0,0023 в 3-4 эпоху, это не такДля меня не имеет смысла, что с метриками тоже получается моя сбалансированная точность и прочее

Я тренируюсь с PNG-изображением Аорты, с диапазоном серого 0.-1.и пользователь получает около 10 тыс. изображений в каждую эпоху, по 9 на пакет, используя оптимизатор Adam с обучающей крысой 0,01 и уменьшая 1/2 каждые 5 эпох

код, который используется в качестве базовой сети в моей работе Github

картина странных вещей сбалансированная точность , точность , отзыв , потеря

это изображение, как правило, выглядит таким образом, когда подача на поезд обрезается до 256 * 256 из исходного 512 * 512 изображений, например this

Функция потери, которую я использую

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 dice_coef(y_true, y_pred):
y_true = K.flatten(y_true)
y_pred = K.flatten(y_pred)
intersection = K.sum(y_true * y_pred)
return K.mean((2. * intersection + K.epsilon()) / (K.sum(y_true) + K.sum(y_pred) + K.epsilon()))

def dice_coef_loss(y_true, y_pred):
return 1 - dice_coef(y_true, y_pred)

def binary_crossentropy(y, p):
return K.mean(K.binary_crossentropy(y, p))

Метрики были реализованы из вики , в которых обычно используется логическое значение типа

def balanced_accuracy(y_true, y_pred):
y_true = K.cast(y_true > 0.1, 'float32')
y_pred = K.cast(y_pred > 0.1, 'float32')

tp = K.sum(y_true[...,1] * y_pred[...,1])
fp = K.sum(y_true[...,0] * y_pred[...,1])
tn = K.sum(y_true[...,0] * y_pred[...,0])
fn = K.sum(y_true[...,1]) - tp

tpr = (tp+K.epsilon()) / (tp+fn+K.epsilon())
tnr = (tn+K.epsilon()) / (tn+fp+K.epsilon())

return K.mean((tpr + tnr) / 2.)

def recall(y_true, y_pred):
y_true = K.cast(y_true > 0.1, 'float32')
y_pred = K.cast(y_pred > 0.1, 'float32')

tp = K.sum(y_true[...,1] * y_pred[...,1])
fn = K.sum(y_true[...,1]) - tp

return K.mean((tp + K.epsilon())  / (tp + fn + K.epsilon()))

def precision(y_true, y_pred):
y_true = K.cast(y_true > 0.1, 'float32')
y_pred = K.cast(y_pred > 0.1, 'float32')

tp = K.sum(y_true[...,1] * y_pred[...,1])
fp = K.sum(y_true[...,0] * y_pred[...,1])

return K.mean((tp + K.epsilon())  / (tp + fp + K.epsilon()))
...