Graph 执行中不允许使用 `tf.Tensor` 作为 Python `bool`。使用 Eager execution 或使用 @tf.function 装饰此函数

Vin*_*ent 14 python keras tensorflow

目前我遇到了这个错误,有人可以帮忙解决吗?

---------------------------------------------------------------------------
OperatorNotAllowedInGraphError            Traceback (most recent call last)
<ipython-input-24-0211c82920d0> in <module>
      7 warnings.filterwarnings("ignore")
      8 model.train(dataset_train,dataset_val, learning_rate=config.LEARNING_RATE,epochs=5,
----> 9             layers='heads')
/kaggle/working/maskrcnn/Mask_RCNN-master/mrcnn/model.py in train(self, train_dataset, val_dataset, learning_rate, epochs, layers, augmentation, custom_callbacks, no_augmentation_sources)
   2355         log("Checkpoint Path: {}".format(self.checkpoint_path))
   2356         self.set_trainable(layers)
-> 2357         self.compile(learning_rate, self.config.LEARNING_MOMENTUM)
   2358
   2359         # Work-around for Windows: Keras fails on Windows when using
/kaggle/working/maskrcnn/Mask_RCNN-master/mrcnn/model.py in compile(self, learning_rate, momentum)
   2168         for name in loss_names:
   2169             layer = self.keras_model.get_layer(name)
-> 2170             if layer.output in self.keras_model.losses:
   2171                 continue
   2172             loss = (
/opt/conda/lib/python3.6/site-packages/tensorflow_core/python/framework/ops.py in __bool__(self)
    763       `TypeError`.
    764     """
--> 765     self._disallow_bool_casting()
    766
    767   def __nonzero__(self):

/opt/conda/lib/python3.6/site-packages/tensorflow_core/python/framework/ops.py in _disallow_bool_casting(self)
    532     else:
    533       # Default: V1-style Graph execution.
--> 534       self._disallow_in_graph_mode("using a `tf.Tensor` as a Python `bool`")
    535
    536   def _disallow_iteration(self):

/opt/conda/lib/python3.6/site-packages/tensorflow_core/python/framework/ops.py in _disallow_in_graph_mode(self, task)
    521     raise errors.OperatorNotAllowedInGraphError(
    522         "{} is not allowed in Graph execution. Use Eager execution or decorate"
--> 523         " this function with @tf.function.".format(task))
    524
    525   def _disallow_bool_casting(self):

OperatorNotAllowedInGraphError: using a `tf.Tensor` as a Python `bool` is not allowed in Graph execution. Use Eager execution or decorate this function with @tf.function.
Run Code Online (Sandbox Code Playgroud)

Ale*_*NON 5

正如错误消息所解释的,您尝试将 atf.Tensor用作 Python bool。这通常发生在预期条件如下:

if layer.output in self.keras_model.losses:
Run Code Online (Sandbox Code Playgroud)

该部分layer.output in self.keras_model.losses应评估为 Python 尝试用作 bool 来检查if条件的张量。这仅在急切执行中允许。

您必须使用 转换if构造tf.cond,或者依靠@tf.function为您完成工作。

没有更多的代码,很难帮助你更多......

  • 在这种特定情况下如何使用 ``tf.cond```` 或````@tf.function```` (````if layer.output in self.keras_model.losses:```) (2认同)

小智 5

我也遇到了这个问题,因此我将解决这个问题的方法留给任何人。

自从 tf 升级到 2.x 以来,当您处于急切执行模式时有一个问题,如果您使用 keras API 损失和指标,您应该实例化它们以进行编译。请参阅下面的示例;

model.compile(optimizer="...", 
              loss=keras.losses.AnyLoss, 
              metrics=[keras.metrics.AnyMetric])
Run Code Online (Sandbox Code Playgroud)

上面的代码会给OperatorNotAllowedInGraphError. 克服这样做;

my_loss = keras.losses.AnyLoss(lr, *args, **kwargs)
my_metric = keras.metrics.AnyMetric(*args, **kwargs)

model.compile(optimizer,
              loss = my_loss
              metrics = [my_metric_1, my_metric_2...]
Run Code Online (Sandbox Code Playgroud)

这应该够了吧