我正在尝试将U-net与诸如inceptionresnetv2之类的骨干网一起使用,将resnet与来自CT-Scan的医学图像进行分割,当我开始训练时,在3-4时,损失将接近0,如0.0023,这不是对我来说没有道理,指标也是如此,我的平衡精度和其他
我正在用主动脉的PNG图像进行训练,灰度范围为0.-1。和用户每个时代大约有1万张图片,使用Adam优化器在学习大鼠0.01的情况下每批9张图片,每5个时代减少1/2张图片
在我的工作Github中用作基础网络的代码
奇怪的事物balanced accuracy,precision,recall,loss的图片
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()))