在Keras&Tensorflow中使用model.fit()时,如何选择要登录命令行的度量子集

2024-05-19 09:32:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Keras和Tensorflow中添加了许多指标来跟踪我的多类细分模型的性能。这些度量包括类度量函数和聚合度量函数。现在Tensorboard包含了我想要的所有内容,但是我的命令行输出现在看起来过载了。我想从命令行输出中删除类度量,同时将它们保留在Tensorboard中。可能吗

model.compile(loss=dice_loss, 
              metrics=[f1score, f1score_class0, f1score_class1, f1score_class2])

在我自己实现train_steptest_step时是否可能?我是否需要从头开始实施培训循环


Tags: 函数命令行模型内容model度量tensorflowstep
2条回答

根据Ivan K.的回答,我提出了另一个想法:

keras.callbacks.ProgbarLogger负责记录到命令行。 可以将keras的ProgbarLogger子类化,并将ProgbarLogger添加到回调中。它将阻止Keras添加默认的ProgbarLogger,从而替换它。只需实现所有将日志作为参数接收的方法,过滤日志并将过滤后的日志传递给相应的父类方法

此示例删除opt_out列表中包含子字符串的日志

import tensorflow as tf
class CustomProgbarLogger(tf.keras.callbacks.ProgbarLogger):
    def __init__(self, count_mode="samples", stateful_metrics=None, opt_out=[]):
        super().__init__(count_mode=count_mode, stateful_metrics=stateful_metrics)
        self.opt_out = opt_out

    def _filter(self, logname):
        return all(word not in logname for word in self.opt_out)

    def _filter_logs(self, logs):
        return logs and {key: value for key, value in logs.items() if self._filter(key)}

    def on_train_batch_end(self, batch, logs=None):
        super().on_train_batch_end(batch, self._filter_logs(logs))

    def on_test_batch_end(self, batch, logs=None):
        super().on_test_batch_end(batch, self._filter_logs(logs))

    def on_epoch_end(self, epoch, logs=None):
        super().on_epoch_end(epoch, self._filter_logs(logs))

    def on_test_end(self, logs=None):
        super().on_test_end(self._filter_logs(logs))

    def on_predict_end(self, logs=None):
        super().on_predict_end(self._filter_logs(logs))

此示例将删除包含键中的字符串classprecisionrecall之一的每个日志

progbar_callback = CustomProgbarLogger(opt_out=["class", "precision", "recall"])
model.fit(dataset, callbacks=[progbar_callback, tensorboard_callback])

这可以通过回调轻松完成。即:

  1. 编写一个回调,只打印您感兴趣的指标。关于如何编写回调,请参见this tutorial
  2. model.fit中设置verbose=0并将回调添加到callbacks
  3. 进行培训

据我所知,tensorboard使用所有原木。因此,它将从所有epoche获取所有度量

如果您在培训期间根本不需要打印任何信息,您可以设置verbose=0

相关问题 更多 >

    热门问题