【问题标题】:How do I append values of a custom metric from a custom Callback to "logs" which I need to use in tensorboard?如何将自定义指标的值从自定义回调附加到我需要在张量板中使用的“日志”?
【发布时间】:2020-12-12 01:52:51
【问题描述】:

我需要在每个 epoch 之后实现一个自定义回调来计算 AUC,我需要将其用作基于 LSTM 的神经网络中的指标。这是自定义回调:

from tensorflow.keras.callbacks import Callback
class RocCallback(Callback):
    def __init__(self,training_data,validation_data):
        self.x = training_data[0]
        self.y = training_data[1]
        self.x_val = validation_data[0]
        self.y_val = validation_data[1]

        

    def on_train_begin(self, logs={}):
        self.roc_train_list = []
        self.roc_val_list = []
        self.roc_train=0
        self.roc_val=0
        logs["roc_train"] = []
        logs["roc_val"] = []
        return 


    def on_epoch_end(self, epoch, logs):
        y_pred_train = self.model.predict(self.x)
        roc_train = roc_auc_score(self.y, y_pred_train)
        y_pred_val = self.model.predict(self.x_val)
        roc_val = roc_auc_score(self.y_val, y_pred_val)
        #print('\rroc-auc_train: %s - roc-auc_val: %s' % (str(round(roc_train,4)),str(round(roc_val,4))),end=100*' '+'\n')
        
        # self.history['roc_auc_train'].append(round(roc_train,4))

        # self.history['roc_auc_val'].append(round(roc_val,4))
        self.roc_train = round(roc_train,4)
        self.roc_val = round(roc_val,4) 
        self.roc_train_list.append(self.roc_train)
        self.roc_val_list.append(self.roc_val)
        print("\rroc_train: %f — roc_val: %f" %(self.roc_train, self.roc_val))
        
        logs["roc_train"]= self.roc_train
        logs["roc_val"] = self.roc_val

        return logs

有两件事不能正常工作:

  1. print("\rroc_train: %f — roc_val: %f" %(self.roc_train, self.roc_val)) 打印就在纪元进度条,但它需要打印就在之后 例如:
Epoch 2/20
roc_train: 0.550000 — roc_val: 0.547800
2561/2561 [==============================] - 89s 35ms/step - loss: 0.5326 - val_loss: 0.4513
Epoch 3/20
roc_train: 0.559800 — roc_val: 0.558000
2561/2561 [==============================] - 88s 34ms/step - loss: 0.5049 - val_loss: 0.4406
  1. tensorboard 中的日志只有 epoch_loss 作为度量,但没有“roc_train”或“roc_val”值。 我试过了
logs["roc_train"].append(self.roc_train)
logs["roc_val"].append(self.roc_val)

但它会引发一个关键错误。

【问题讨论】:

    标签: python tensorflow keras callback


    【解决方案1】:

    作为一种快速的替代方法,您是否尝试过使用内置的https://www.tensorflow.org/api_docs/python/tf/keras/metrics/AUC,度量,

    tf.keras.metrics.AUC(
        num_thresholds=200, curve='ROC', summation_method='interpolation', name=None,
        dtype=None, thresholds=None, multi_label=False, label_weights=None
    )
    

    它可能会暂时解决您的问题。

    你的代码确实没有错;在 model.fit() 的回调列表中,您能否将您的回调放在列表的第一个位置;就我而言,碰巧我想保存一次到 .csv 并且 CustomMetric() 回调是最后一次,因此 .csv 仅保存了 loss 和 val_loss 而不是我的自定义指标。

    【讨论】:

    • 这个任务的部分要求是我需要使用自定义回调。无论如何,我想学着做对。从长远来看会有所帮助。
    • 您是否按照我在回答最后一部分中的建议进行操作?
    • 嗨,对不起,我忘了提这个。是的,我做到了。我将回调作为 model.fit() 中的第一个参数。结果没有变化。 'logs' 仍然只有 epoch_loss。
    • 你使用的是哪个 TensorFlow 版本?
    • @sans_mist 我可以确认在 TensorFlow 2.3 中存在一些问题,我的情况下的日志总是空的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    相关资源
    最近更新 更多