【问题标题】:How to properly raise exception in TensorFlow graph如何在 TensorFlow 图中正确引发异常
【发布时间】:2020-08-13 14:59:13
【问题描述】:

我想根据图形模式下输入张量的值(在 TensorFlow 服务中)引发 tf.errors.InvalidArgumentError 异常。

目前我使用tf.debugging.assert_all_finite,这很好用。由于我不是对错误检查做出断言,而是根据输入引发异常,因此最好引发显式异常。

我的问题归结为:

  • 如何有条件地执行不返回张量的代码
  • 如何引发 tf.errors 异常。

这样做的正确方法是什么?

编辑: 一些更详细的。我想在不使用 tf.debugging 的情况下重新创建以下逻辑(除非这实际上是正确的方法)。

目前我正在检查没有像这样的NaN 值:

assert_op = tf.debugging.assert_all_finite(
    input_data,
    'Cant have nans at beginning or end'
)

【问题讨论】:

  • 您不能在图形“内部”引发或捕获异常。该图可以在任何甚至不知道异常是什么的设备(例如 GPU)上运行。但是,该图可以包含控制流结构,例如tf.cond,可用于模拟该行为。请注意,tf.errors.InvalidArgumentError 在编译时引发,而不是在运行时引发。
  • @a_guest:您可以在运行时引发异常,例如通过tf.Assert。但是,您无法捕捉到它(在图表内)。我在回答中对此进行了扩展。
  • @Albert 是的,您可以在运行时引发异常,但这不会在图中发生。 tf.Assert 在幕后使用tf.cond 来创建逻辑分支。然后在“控制器”空间中引发异常。也许我误解了这个问题,但似乎目标是在运行时引发异常。这与 让 tensorflow 引发异常 完全不同——不是关于结果,而是关于实现。尽管如此,我同意tf.Assert 正是这里的正确选择。

标签: python python-3.x tensorflow tensorflow2.0 tensorflow-serving


【解决方案1】:

正如你通过邮件给我写的,这可能与this TF issue about catching exceptions within the graph executionthis related SO question 有关。但是,我不确定这是否真的适合您。这个 TF 问题和 SO 问题是关于如何动态catch 异常,所以基本上在 TF 图中实现 try: ... except: ...

引入控制结构的其他 TF 功能有:

  • tf.while_loop
  • tf.cond

tf.cond 是您如何有条件地执行代码的问题的答案。取决于条件,即 bool 标量。但也许这不是你真正的问题,而是如何制定条件?

tf.check_numerics 检查张量的 inf/nan 并在找到这样的张量时抛出异常。

如果您想将其作为条件,您可以使用以下代码:

is_finite = tf.reduce_all(tf.is_finite(x))

如果你想在某些条件不成立的情况下抛出异常,你可以这样做:

check_op = tf.Assert(is_finite, ["Tensor had inf or nan values:", x])

您可能希望使用tf.control_dependencies 来确保执行此操作check_op

【讨论】:

  • 感谢您的帮助。在 TensorFlow 2 中,tf.debugging.assert_all_finitetf.debugging.check_numerics 似乎都可以完成这项工作。我对assert 关键字感到困惑,我认为可能有一种方法可以显式引发特定异常。这可以完成工作。感谢您快速而彻底的回答。
猜你喜欢
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 2015-01-11
  • 1970-01-01
相关资源
最近更新 更多