Keras 如何从带有EarlyStopping或ModelCheckpoint的回调中使用自定义度量?
我想在另一个回调(如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
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”对象不可下标