簡體   English   中英

如何將自定義指標的值從自定義回調附加到我需要在張量板中使用的“日志”?

[英]How do I append values of a custom metric from a custom Callback to “logs” which I need to use in tensorboard?

我需要實現一個自定義回調來計算每個時期后的 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)

但它引發了一個關鍵錯誤。

作為一種快速的替代方法,您是否嘗試過使用內置的https://www.tensorflow.org/api_docs/python/tf/keras/metrics/AUC 、metric、

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 而不是我的自定義指標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM