如何在TensorFlow图中正确引发异常

时间:2020-04-29 13:42:04

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

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

当前,我使用tf.debugging.assert_all_finite,它可以正常工作。由于我不是要断定bug检查,而是要根据输入引发异常,所以最好提出一个显式异常。

我的问题归结为:

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

正确的做法是什么?

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

目前,我正在检查是否没有这样的NaN值:

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

1 个答案:

答案 0 :(得分:1)

在您通过邮件写信给我时,这可能与this TF issue about catching exceptions within the graph executionthis related SO question有关。但是,我不确定这是否真的与您相关。这个TF问题和SO问题是关于如何动态捕获异常,因此基本上在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

相关问题