【发布时间】: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