2020/4/5代码更新:
之前的F1代码在分布式训练过程中有问题,但问题不是出在我的metrics没有考虑分布式上(事实上,keras.metrics.Metric这个抽象类已经替我们考虑好了分布式的问题),而是代码写错了,正确的如下:
class F1_score(keras.metrics.Metric):
def __init__(self, thresholds=0.5, name='f1', **kwargs):
super(F1_score, self).__init__(name=name, **kwargs)
self.tp = self.add_weight(name='tp', initializer='zeros')
self.fp = self.add_weight(name='fp', initializer='zeros')
self.fn = self.add_weight(name='fn', initializer='zeros')
self.thresholds=thresholds
def update_state(self, y_true, y_pred, sample_weight=None):
y_pred=tf.cast(tf.where(y_pred>self.thresholds,1,0),tf.int8)
y_true=tf.cast(y_true,tf.int8)
tp=tf.math.count_nonzero(y_pred*y_true,dtype=tf.float32)
fp=tf.math.count_nonzero(y_pred*(1-y_true),dtype=tf.float32)
fn=tf.math.count_nonzero((1-y_pred)*y_true,dtype=tf.float32)
self.tp.assign_add(tp)
self.fp.assign_add