【问题标题】:How to create a variable that persists over tf.estimator.train_and_evaluate evaluation steps?如何创建一个在 tf.estimator.train_and_evaluate 评估步骤中持续存在的变量?
【发布时间】:2019-08-07 20:30:33
【问题描述】:

TLDR:如何创建一个变量来保存用于计算自定义指标的混淆矩阵,并在所有评估步骤中累积值?

have implemented 自定义指标在tf.estimator.train_and_evaluation 管道中使用,混淆矩阵是所有指标的关键。我的目标是让这个混淆矩阵在多个评估步骤中持续存在,以便跟踪学习进度。

在变量范围内使用get_variable 不起作用,因为它不会将变量保存到检查点(或者看起来如此)。

这不起作用:

    @property
    def confusion_matrix(self):
        with tf.variable_scope(
            f"{self.name}-{self.metric_type}", reuse=tf.AUTO_REUSE
        ):
            confusion_matrix = tf.get_variable(
                name="confusion-matrix",
                initializer=tf.zeros(
                    [self.n_classes, self.n_classes],
                    dtype=tf.float32,
                    name=f"{self.name}/{self.metric_type}-confusion-matrix",
                ),
                aggregation=tf.VariableAggregation.SUM,
            )
        return confusion_matrix

只需将矩阵保存为类属性即可,但显然不会在多个步骤中持续存在:

        self.confusion_matrix = tf.zeros(
            [self.n_classes, self.n_classes],
            dtype=tf.float32,
            name=f"{self.name}/{self.metric_type}-confusion-matrix",
        )

您可以查看完整示例here

我希望这个混淆矩阵在评估期间从头到尾持续存在,但我不需要在最终的 SavedModel 中使用它。您能告诉我如何实现这一目标吗?我需要将矩阵保存到外部文件,还是有更好的方法?

【问题讨论】:

  • 你在model_fn内部评估期间尝试过tf.metrics.mean_tensor吗?
  • @alexey,我将convert 一个tf.keras 模型添加到估计器,然后使用tf.contrib.estimator.add_metrics 添加指标。自定义指标 do use tf.metrics.mean 在后台,但我不确定这是否能保证它们在评估步骤中持续存在。您能否扩展您的建议?

标签: python tensorflow tensorflow-estimator


【解决方案1】:

您可以定义自定义指标:

def confusion_matrix(labels, predictions):
    matrix = ... # confusion matrix calculation
    mean, update_op = tf.metrics.mean_tensor(matrix)
    # do something with mean if needed
    return {'confusion_matrix': (mean, udpate_op)}

然后将其添加到您的estimator

estimator = tf.estimator.add_metrics(estimator, confusion_matrix)

如果您需要 sum 而不是 meen,您可以从 tf.metrics.mean_tensor 实现中获得洞察

【讨论】:

  • 谢谢,但我不明白这如何回答我的问题,如果措辞令人困惑,请见谅。我实现的所有指标都在底层使用了相同的混淆矩阵。但是,目前我为每个对象创建了一个带有混淆矩阵的对象。最好创建一次变量并将其用于每个评估步骤,在推理后更新一次,然后根据其值计算自定义指标。正如您在代码 herehere 中看到的那样,添加指标不是问题。
  • update_op 实际上在每个评估步骤中执行并修改 mean 张量,所以它看起来像你需要的。如果您需要计算不同的指标,您可以在 confusion_matrix 中执行并包含在返回的字典中
  • 不确定我是否可以将它们包含在返回的字典中,因为字典的值必须包含更新操作。你是说我需要从mean, update_op = tf.metrics.mean_tensor(matrix)mean进行操作,然后将结果也包裹在mean_tensor中?
  • 是的,mean 来自mean, update_op = tf.metrics.mean_tensor(matrix)。我认为您可以从mean_tensor 重用update_op。此操作修改了均值计算所需的 sumcount 张量。
  • @sdll,您能否确认您的问题是否已解决?如果是这样,为了社区的利益,您能否在此处指定答案。谢谢!
猜你喜欢
  • 2020-11-21
  • 2018-09-20
  • 1970-01-01
  • 2021-06-07
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多