【问题标题】:How visualize in Tensorboard a metric callback?如何在 Tensorboard 中可视化度量回调?
【发布时间】:2020-01-25 20:38:09
【问题描述】:

我在 keras 中有一个模型,我将自定义指标用作:

class MyMetrics(keras.callbacks.Callback):
    def __init__(self):
        initial_value = 0
    def on_train_begin(self, logs={}):
        ...
    def on_epoch_end(self, batch, logs={}):
        here I calculate my important values

现在,有一种方法可以在 Tensorboard 中可视化它们吗? 例如,如果我的指标是这样的:

def mymetric(y_true,y_pred):
    return myImportantValues

我可以在 Tensorboard 中通过 mymodel.compile(..., metrics = mymetric)

指标回调有类似的东西吗? 我尝试在 MyMetric 类中创建一个函数并将其传递给mymodel.compile,但它不会更新值。

【问题讨论】:

  • 您可以继承Tensorboard 类并使用它的writer 来编写您需要的内容,而不是继承基类Callback

标签: keras tensorboard


【解决方案1】:

您可以使用自定义指标创建一个事件文件,并直接在 tensorboard 中将其可视化。

这适用于 TensorFlow 2.0。在此示例中,准确度/指标是从训练历史记录中记录的。在您的情况下,您可以通过 on_epoch_end 回调来完成。

import datetime
current_time = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
train_log_dir = 'logs/train/' + current_time
train_summary_writer = tf.summary.create_file_writer(train_log_dir)

history = model.fit(x=X, y=y, epochs=100, verbose=1)
for epoch in range(len(history.history['accuracy'])):
    with train_summary_writer.as_default():
        tf.summary.scalar('loss', history.history['loss'][epoch], step=epoch)
        tf.summary.scalar('accuracy', history.history['accuracy'][epoch], step=epoch)

脚本执行后,

tensorboard --logdir 日志/训练

https://www.tensorflow.org/tensorboard/r2/get_started#using_tensorboard_with_other_methods

【讨论】:

    【解决方案2】:

    你需要先创建一个自定义回调:

    class CustomLogs(Callback):
        def __init__(self, validation_data=()):
            super(Callback, self).__init__()
            self.X_val, self.y_val = validation_data
            
        def on_train_begin(self, logs={}):        
        ## on begin of training, we are creating a instance f1_scores
            self.model.f1_scores = []
    
        def on_epoch_end(self, epoch, logs={}):
            # calculating micro_avg_f1_score 
            val_predict_proba = np.array(self.model.predict(self.X_val))
            val_predict = np.round(val_predict_proba)
            val_targ = self.y_val
             #using scikit-learn f1_score 
            f1 = f1_score(val_targ, val_predict, average='micro')
             #appending f1_scores for every epoch
            self.model.f1_scores.append(f1)
            print('micro_f1_score: ',f1)
    
    #initilize your call back with validation data
    customLogs = CustomLogs(validation_data=(X_test, Y_test)) 
    
    #not change in commpile method 
    model.compile(optimizer='Adam',loss='CategoricalCrossentropy')
    
    #pass customLogs and validation_data in fit method
    model.fit(X_train,
              Y_train,
              batch_size=32,
              validation_data=(X_test, Y_test),
              callbacks=[customLogs],
              epochs=20)
    
    #After fit method  accessing the f1_scores
    f1_scores = model.f1_scores
    # writing the summary in tensorboard
    log_dir='/log'
    writer=tf.summary.create_file_writer(log_dir)
    for idx in range(len(f1_scores)):
        with writer.as_default(step=idx+1):
            tf.summary.scalar('f1_scores', f1_scores[idx])
    writer.flush ()
    

    现在启动:张量板 --logdir /log。 您可以在 tesorboard scalers 中看到 f1_scores 的图

    【讨论】:

      猜你喜欢
      • 2017-05-31
      • 2019-03-12
      • 2019-10-09
      • 2020-05-09
      • 2023-01-17
      • 2019-02-13
      • 2021-11-13
      • 2018-05-25
      • 2020-10-31
      相关资源
      最近更新 更多