损失下降如此之快,而其他指标却给出了奇怪的价值

时间:2018-12-15 14:46:32

标签: keras deep-learning image-segmentation

我正在尝试将U-net与诸如inceptionresnetv2之类的骨干网一起使用,将resnet与来自CT-Scan的医学图像进行分割,当我开始训练时,在3-4时,损失将接近0,如0.0023,这不是对我来说没有道理,指标也是如此,我的平衡精度和其他

我正在用主动脉的PNG图像进行训练,灰度范围为0.-1。和用户每个时代大约有1万张图片,使用Adam优化器在学习大鼠0.01的情况下每批9张图片,每5个时代减少1/2张图片

在我的工作Github中用作基础网络的代码

奇怪的事物balanced accuracyprecisionrecallloss的图片

that image are usually like this when feed for train从原来的512 * 512图像裁剪为256 * 256,例如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))

指标是从wiki实现的,通常会使用布尔值,如

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()))

0 个答案:

没有答案