【问题标题】:Merging 2 plots in TensorBoard 2 with TensorFlow 2将 TensorBoard 2 中的 2 个图与 TensorFlow 2 合并
【发布时间】:2020-01-30 13:16:36
【问题描述】:

我想使用 Tensorflow 和 tensorboard V2 在同一个图上合并精度和召回率。我为以前的版本找到了许多示例,但在我的情况下它们都不起作用。

我创建了一个 Keras 回调来计算精度和召回率,然后我调用一个 tensorflow 摘要将它们记录在同一个记录器中。我可以在 Tensorboard 中将它们可视化,但在 2 个单独的图中。

Class ClassificationReport(Callback):
    def __init__(self, data_generator, steps, label_names, log_directory):
        """
        Instantiator
        :param data_generator: the data generator that produces the input data
        :param steps: int, batch size
        :param data_type, string, 'training', 'validation' or 'test', used a prefix in the logs
        :param log_directory: pathlib2 path to the TensorBoard log directory

        """

        self.data_generator = data_generator
        self.steps = steps
        self.data_type = data_type
        self.logger = tensorflow.summary.create_file_writer(str(log_directory / self.data_type))

        # names of the scalar to consider in the sklearn classification report
        self._scalar_names = ['precision', 'recall']

    def on_epoch_end(self, epoch, logs={}):
        """
        log the precision and recall

        :param epoch: int, number of epochs
        :param logs: the Keras dictionary where the metrics are stored
        """

        y_true = numpy.zeros(self.steps)
        y_predicted = numpy.zeros(self.steps)

       ...Here I fetch y_true and y_predicted with the data_generator

        # The current report is calculated by SciKit-Learn
        current_report = classification_report(y_true, y_predicted, output_dict=True)

        with self.logger.as_default():
            for scalar_name in self._scalar_names:
                tensorflow.summary.scalar(
                    name="{} / macro average / {}".format(self.data_type, scalar_name),
                    data=current_report['macro avg'][scalar_name],
                    step=epoch)

        return super().on_epoch_end(epoch, logs)

据我了解 Tensorboard 2 的逻辑,似乎不可能在同一个图上绘制 2 个标量摘要......现阶段欢迎任何建议。

【问题讨论】:

    标签: tensorflow keras tensorboard


    【解决方案1】:

    使用具有相同标量摘要名称的两个不同编写器。

    import numpy as np
    import tensorflow as tf
    
    logger1 = tf.summary.create_file_writer('logs/scalar/precision')
    logger2 = tf.summary.create_file_writer('logs/scalar/recall')
    
    precision = np.random.uniform(size=10)
    recall = np.random.uniform(size=10)
    
    for i in range(10):
        with logger1.as_default():
            tf.summary.scalar(name='precision-recall', data=precision[i], step=i)
        with logger2.as_default():
            tf.summary.scalar(name='precision-recall', data=recall[i], step=i)
    

    tensorboard --logdir 日志/标量

    来自这个答案,适用于 tf2:https://stackoverflow.com/a/38718948/5597718

    【讨论】:

    • 效果很好。我在摘要逻辑中遗漏了一些东西。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2016-04-20
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多