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

Python 如何在TensorFlow图中正确引发异常,python,python-3.x,tensorflow,tensorflow2.0,tensorflow-serving,Python,Python 3.x,Tensorflow,Tensorflow2.0,Tensorflow Serving,我想根据图形模式(在TensorFlow服务中)中输入张量的值引发tf.errors.InvalidArgumentError异常 目前我使用的是tf.debug.assert\u all\u finite,效果很好。由于我不是在对bug检查进行断言,而是在输入的基础上引发一个异常,所以最好引发一个显式异常 我的问题归结为: 如何有条件地执行不返回张量的代码 如何引发tf.errors异常 这样做的正确方式是什么 编辑: 更多细节。我希望在不使用tf.debuging的情况下重新创建以下逻辑

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

目前我使用的是
tf.debug.assert\u all\u finite
,效果很好。由于我不是在对bug检查进行断言,而是在输入的基础上引发一个异常,所以最好引发一个显式异常

我的问题归结为:

  • 如何有条件地执行不返回张量的代码
  • 如何引发tf.errors异常
这样做的正确方式是什么

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

目前,我正在检查是否不存在如下值:

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

正如你通过邮件给我写的,这可能与,和有关。然而,我不确定这是否真的与你有关。这个TF问题和其他问题是关于如何动态地捕获异常,所以基本上实现
try:。。。除了:…
在TF图中

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

  • tf.while\u循环
  • tf.cond
tf.cond
是您如何有条件地执行代码的问题的答案。取决于条件,即a
bool
scalar。但也许这不是你真正的问题,而是,如何制定条件

有一个
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\u dependencies
来确保执行此操作
check\u op

您无法在图形的“内部”引发或捕获异常。该图可能运行在甚至不知道异常是什么的任何设备(如GPU)上。但是,该图可以包含控制流结构,例如可以用来模拟该行为的控制流结构。请注意,
tf.errors.InvalidArgumentError
是在编译时而不是在运行时引发的。@a_guest:您可以在运行时引发异常,例如通过
tf.Assert
。但是,您无法捕捉到它(在图中)。我在回答中对此进行了扩展。@Albert是的,您可以在运行时引发异常,但这不会发生在图中
tf.Assert
在封面下使用
tf.cond
创建逻辑分支。然后在“控制器”空间中引发异常。也许我误解了这个问题,但似乎目标是在运行时引发异常。这与tensorflow引发异常完全不同——不是针对结果,而是针对实现。尽管如此,我还是同意
tf.Assert
是正确的选择。谢谢你的帮助。在TensorFlow 2
tf.debug.assert\u all\u finite
tf.debug.check\u numerics
中,两者似乎都能完成这项工作。我被
assert
关键字弄糊涂了,我认为可能有一种方法可以显式地引发特定的异常。这就行了。谢谢你快速而彻底的回答。