def f1_score_semeval(y_true, y_pred):
#convert probas to 0,1
y_pred_ones = K.zeros_like(y_true)
#y_pred_ones[:, K.argmax(y_pred, axis=-1)] = 1
#indices_x = K.arange(start=0, stop=y_true.get_shape()[0])
indices_x = K.expand_dims(K.arange(start=0, stop=tf.shape(y_true, name='get_indicec_x_shape')[0], dtype='int64'), dim=-1)
indices_y = K.expand_dims(K.argmax(y_pred, axis=-1), dim=-1)
indices = K.concatenate((indices_x, indices_y))
values = K.sum(K.ones_like(indices_x, dtype='float32'), axis=-1)
shape = K.cast(tf.shape(y_pred_ones), dtype='int64')
delta = tf.SparseTensor(indices, values, shape)
y_pred_ones = y_pred_ones + tf.sparse_tensor_to_dense(delta)
#where y_ture=1 and y_pred=1 -> true positive
y_true_pred = K.sum(y_true*y_pred_ones, axis=0)
#for each class: how many where classified as said class
pred_cnt = K.sum(y_pred_ones, axis=0)
#for each class: how many are true members of said class
gold_cnt = K.sum(y_true, axis=0)
#precision for each class
precision = tf.select(K.equal(pred_cnt, 0), K.zeros_like(y_true_pred), y_true_pred/pred_cnt, name='precision_f1_semeval')
#recall for each class
recall = tf.select(K.equal(gold_cnt, 0), K.zeros_like(y_true_pred), y_true_pred/gold_cnt, name='racall_f1_semeval')
#f1 for each class
f1_class = tf.select(K.equal(precision + recall, 0), K.zeros_like(y_true_pred), 2*(precision*recall)/(precision+recall), name='precision_f1_semeval')
#return average f1 score over all classes
return (f1_class[0] + f1_class[2])/2.0
评论列表
文章目录