我正在为医学图像分割进行MRI扫描,因为它是非常不平衡的数据集,我为每个图像使用了unet +余弦骰子损失+类别权重,但是我没有得到令人满意的结果。有时它可以正常工作,但有时由于在同一数据集上未检测到细分而发生。
def class_weight_gen(y_true):
y = np.argmax(y_true,axis=-1).reshape([-1])
w = compute_class_weight('balanced',np.unique(y),y)
w_real = np.zeros(4)
index = np.unique(y)
for i in index:
w_real[i]=w[i]
return w_real
def dice_loss(y_true,y_pred):
axis = tuple(range(1,len(y_pred.shape)-1))
numerator = 2. * K.sum(K.abs(y_pred * y_true), axis)
denominator = K.sum(K.abs(y_pred) + K.abs(y_true), axis)
dsc = K.mean(numerator*class_weight_gen(y_true)/denominator)
cos_dsc_loss = np.power(K.cos(((np.pi)/2)*dsc),1.7)
return cos_dsc_loss
def dice_score(y_true,y_pred):
numerator = 2.* K.sum(K.abs(y_pred * y_true))
denominator =K.sum(K.abs(y_pred) + K.abs(y_true))
dsc = K.mean(numerator/denominator)
return dsc
sgd = optimizers.SGD(lr=0.05,momentum=0.9,nesterov=False)
model.compile(optimizer=sgd,loss=dice_loss,metrics=[dice_score])
lr_reduce = callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3)
U-net model used 我认为我的代码是正确的,但是分段未正确进行,这可能是什么原因。