在Keras中定义自定义精度,以忽略带有特定标签的样本

时间:2018-11-01 01:28:53

标签: python tensorflow keras

我写信给您是因为我有问题,与下面链接中的问题相同,但仍未得到答复。

Previous question

我定义了一个损失函数,该函数排除所有像素= 0:

def ignore_unknown_xentropy(ytrue, ypred):
    return (1-ytrue[:, :, :, 0]) * K.categorical_crossentropy(ytrue, ypred)

我注意到在训练过程中精度发生了失真,将考虑我之前排除的像素等于零。

有一种方法可以定义自定义指标,以从计算中排除y_true上的零像素?

我正在使用这种方法,即计算每个相关标签的准确度并将其相加,但这并不能为我提供可靠的结果:

def single_class_accuracy(y_true, y_pred, class_id):
    class_id_true = K.argmax(y_true, axis=-1)
    class_id_preds = K.argmax(y_pred, axis=-1)
    accuracy_mask = K.cast(K.equal(class_id_preds, class_id), 'int32')
    class_acc_tensor = K.cast(K.equal(class_id_true, class_id_preds), 'int32') * accuracy_mask
    class_acc = K.sum(class_acc_tensor) / K.maximum(K.sum(accuracy_mask), 1)
    return class_acc

def custom_accuracy(y_true, y_pred):
    return single_class_accuracy(y_true, y_pred, 1) + single_class_accuracy(y_true, y_pred, 2)

我的ytrue是单点编码的蒙版。

1 个答案:

答案 0 :(得分:0)

仅通过类加权就没有办法实现这一目标吗? 为您不感兴趣的班级设置0? 我可能会误解了,但是这种方法对我无能为力(忽略零类):

class_weights = {0.0:0.2,0.2:0.2:0.2}
history=model.fit(x=in_train,y=target_train,class_weight=class_weights,
              validation_data=.... etc