我正在使用带有tensorflow后端的keras,并且尝试编写自定义keras损失函数,我需要为我的每个类(我有4个类)计算f1分数,问题是当我编写代码时在编译模型时出现错误,因为y_true
和y_pred
是模型编译时的占位符,因此我无法使用scikit-learn计算f1分数。
解决该问题的通常方法是使用keras后端内置函数来解决自定义丢失,但似乎很难将它们用于按类计算的f1分数。
希望对您有所帮助:)
def F1_Loss(y_true,y_pred):
y_true = K.eval(y_true)
y_pred = K.eval(y_pred)
f1_vector = sklearn.metrics.f1_score(y_true,to_categorical(np.argmax(y_pred,axis=1),num_classes=4),average=None)
return np.mean(f1_vector)
答案 0 :(得分:2)
我解决了我在这里张贴的问题,以防有人遇到相同的问题
def F1_Vector(y_true,y_pred):
tp = K.sum(K.cast(y_true*y_pred, 'float'), axis=0)
tn = K.sum(K.cast((1-y_true)*(1-y_pred), 'float'), axis=0)
fp = K.sum(K.cast((1-y_true)*y_pred, 'float'), axis=0)
fn = K.sum(K.cast(y_true*(1-y_pred), 'float'), axis=0)
p = tp / (tp + fp + K.epsilon())
r = tp / (tp + fn + K.epsilon())
f1 = 2*p*r / (p+r+K.epsilon())
f1_vector = (tf.where(tf.math.is_nan(f1), tf.zeros_like(f1), f1))
return f1_vector