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

AHG*_*AHG 5 python python-3.x tensorflow tensorflow-serving tensorflow2.0

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

目前我正在使用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'
)
Run Code Online (Sandbox Code Playgroud)

Alb*_*ert 3

正如您通过邮件写信给我的那样,这可能与有关在图形执行中捕获异常的 TF 问题以及相关的 SO 问题有关。但是,我不确定这是否真的与您相关。这个 TF 问题和 SO 问题是关于如何动态捕获异常,所以基本上try: ... except: ...在 TF 图中实现。

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

  • tf.while_loop
  • tf.cond

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

tf.check_numerics一个检查张量是否有 inf/nan 的函数,如果找到这样的张量则抛出异常。

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

is_finite = tf.reduce_all(tf.is_finite(x))
Run Code Online (Sandbox Code Playgroud)

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

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

您可能想使用它tf.control_dependencies来确保此操作check_op得到执行。