Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将自定义回调中的自定义度量值附加到";日志“;我需要在张力板中使用哪个?_Python_Tensorflow_Keras_Callback - Fatal编程技术网

Python 如何将自定义回调中的自定义度量值附加到";日志“;我需要在张力板中使用哪个?

Python 如何将自定义回调中的自定义度量值附加到";日志“;我需要在张力板中使用哪个?,python,tensorflow,keras,callback,Python,Tensorflow,Keras,Callback,我需要实现一个自定义回调来计算每个历元后的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_d

我需要实现一个自定义回调来计算每个历元后的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
有两件事不能正常工作:

  • print(“\rroc\u train:%f-roc\u val:%f”%(self.roc\u train,self.roc\u val))
    在历元进度条之前打印,但需要在之后打印 e、 g:
  • tensorboard中的原木只有epoch_损耗作为度量,但没有“roc_train”或“roc_val”值。 我试过了

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

    作为一个快速的替代方案,您是否尝试过使用内置的
    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()中的第一个参数。结果没有变化。”“日志”仍然有epoch_丢失。您使用的是什么TensorFlow版本?@sans_mist我可以确认TensorFlow 2.3中存在一些问题,我的情况下的日志总是空的。
    logs["roc_train"].append(self.roc_train)
    logs["roc_val"].append(self.roc_val)
    
    tf.keras.metrics.AUC(
        num_thresholds=200, curve='ROC', summation_method='interpolation', name=None,
        dtype=None, thresholds=None, multi_label=False, label_weights=None
    )