Keras 如何从带有EarlyStopping或ModelCheckpoint的回调中使用自定义度量?

Keras 如何从带有EarlyStopping或ModelCheckpoint的回调中使用自定义度量?,keras,callback,Keras,Callback,我想在另一个回调(如EarlyStopping或ModelCheckpoint)中使用来自回调的自定义度量。但我需要以某种方式保存/存储/记录这个自定义指标,以便其他回调可以访问它 我有: class Metrics(keras.callbacks.Callback): def on_train_begin(self, logs={}): self.precision = [] self.f1s = [] self.prc=0

我想在另一个回调(如EarlyStopping或ModelCheckpoint)中使用来自回调的自定义度量。但我需要以某种方式保存/存储/记录这个自定义指标,以便其他回调可以访问它

我有:

class Metrics(keras.callbacks.Callback):
    def on_train_begin(self, logs={}):

        self.precision = []
        self.f1s = []
        self.prc=0
        self.f1s=0

    def on_epoch_end(self, epoch, logs={}):
        score = np.asarray(self.model.predict([self.validation_data[0],self.validation_data[1]]))
        predict = np.round(np.asarray(self.model.predict([self.validation_data[0],self.validation_data[1]])))
        targ = self.validation_data[2]

        predict = (predict < 0.5).astype(np.float)


        self.prc=sklm.precision_score(targ, predict)
        self.f1s=sklm.f1_score(targ, predict)
        self.precision.append(prc)
        self.f1s.append(f1s)

        print("— val_f1: %f — val_precision: %f" %(self.f1s, self.prc))
        return
因为EarlyStoping不知道自定义精度度量,所以不起作用


有人知道回调的日志语句吗?我可以在这里给出我的度量吗。

要了解这里到底发生了什么,你必须检查github上EarlyStopping和ModelCheckpoint类的源代码。你可以找到它

代码中的问题是,您没有更新“on\u epoch\u end”函数中的“logs”字典。EarlyStopping和ModelCheckpoint类就是在该字典中查找您定义的“监视器”

因此,在您的情况下,如果要使用精度分数作为监视器,您的代码应该如下所示:

class Metrics(keras.callbacks.Callback):
    def on_train_begin(self, logs={}):

        self.precision = []
        self.f1scores = []
        self.prc=0
        self.f1s=0

    def on_epoch_end(self, epoch, logs={}):
        score = np.asarray(self.model.predict([self.validation_data[0],self.validation_data[1]]))
        predict = np.round(np.asarray(self.model.predict([self.validation_data[0],self.validation_data[1]])))
        targ = self.validation_data[2]

        predict = (predict < 0.5).astype(np.float)


        self.prc=sklm.precision_score(targ, predict)
        self.f1s=sklm.f1_score(targ, predict)
        self.precision.append(prc)
        self.f1scores.append(f1s)

        #Here is where I update the logs dictionary:
        logs["prc"]=self.prc
        logs["f1s"]=self.f1s

        print("— val_f1: %f — val_precision: %f" %(self.f1s, self.prc))

要了解这里到底发生了什么,您必须检查github上EarlyStopping和ModelCheckpoint类的源代码。你可以找到它

代码中的问题是,您没有更新“on\u epoch\u end”函数中的“logs”字典。EarlyStopping和ModelCheckpoint类就是在该字典中查找您定义的“监视器”

因此,在您的情况下,如果要使用精度分数作为监视器,您的代码应该如下所示:

class Metrics(keras.callbacks.Callback):
    def on_train_begin(self, logs={}):

        self.precision = []
        self.f1scores = []
        self.prc=0
        self.f1s=0

    def on_epoch_end(self, epoch, logs={}):
        score = np.asarray(self.model.predict([self.validation_data[0],self.validation_data[1]]))
        predict = np.round(np.asarray(self.model.predict([self.validation_data[0],self.validation_data[1]])))
        targ = self.validation_data[2]

        predict = (predict < 0.5).astype(np.float)


        self.prc=sklm.precision_score(targ, predict)
        self.f1s=sklm.f1_score(targ, predict)
        self.precision.append(prc)
        self.f1scores.append(f1s)

        #Here is where I update the logs dictionary:
        logs["prc"]=self.prc
        logs["f1s"]=self.f1s

        print("— val_f1: %f — val_precision: %f" %(self.f1s, self.prc))

热心的南丁格尔的回答适用于
早期停止
回调,但是,对于
模型检查点
回调,您可能还需要将
日志
标记设置为
,以便将更新的
日志
字典传递给回调:

weights_path = 'checkpoint-{epoch:02d}-{customer_metric_name:.4f}.h5'
checkpoint = tf.keras.callbacks.ModelCheckpoint(weights_path, monitor='customer_metric_name')
checkpoint._supports_tf_logs = False

热心的南丁格尔的回答适用于
早期停止
回调,但是,对于
模型检查点
回调,您可能还需要将
日志
标记设置为
,以便将更新的
日志
字典传递给回调:

weights_path = 'checkpoint-{epoch:02d}-{customer_metric_name:.4f}.h5'
checkpoint = tf.keras.callbacks.ModelCheckpoint(weights_path, monitor='customer_metric_name')
checkpoint._supports_tf_logs = False

正是我想要的。戈尔迪!什么是代码中的
验证\u数据[0]
。因为我收到了
TypeError:“NoneType”对象不可下标
这正是我想要的。戈尔迪!什么是代码中的
验证\u数据[0]
。因为我收到
TypeError:“NoneType”对象不可下标