【问题标题】:Eager execution disabled in Keras model on `predict_step``predict_step` 上的 Keras 模型中禁用了急切执行
【发布时间】:2021-06-20 15:12:40
【问题描述】:

为什么 tensorflow 会在 tf.keras.Modelpredict_step 函数内禁用 Eager Execution?也许我错了,但这里有一个例子:

from __future__ import annotations
from functools import wraps
import tensorflow as tf

def print_execution(func):
    @wraps(func)
    def wrapper(self: SimpleModel, data):
        print(tf.executing_eagerly())  # Prints False
        return func(self, data)
    return wrapper

class SimpleModel(tf.keras.Model):
    def __init__(self):
        super().__init__()

    def call(self, inputs, training=None, mask=None):
        return inputs

    @print_execution
    def predict_step(self, data):
        return super().predict_step(data)

if __name__ == "__main__":
    x = tf.random.uniform((2, 2))
    print(tf.executing_eagerly())  # Prints True
    model = SimpleModel()
    pred = model.predict(x)

这是预期的行为吗?有没有办法强制predict_step 以急切模式运行?

【问题讨论】:

    标签: tensorflow machine-learning keras tensorflow2.0 tf.keras


    【解决方案1】:

    如果你想在 Eager 模式下运行 predict_step 函数,你可以按如下方式进行。请注意,它会将所有内容设置为急切模式。

    import tensorflow as tf
    tf.config.run_functions_eagerly(True)
    

    通常tf.function 处于Graph 模式。使用上面的语句,它们也可以设置为Eager模式,src

    根据您的评论,AFAIK,如果您在编译模型时设置run_eagerly,应该没有任何区别。这是来自官方声明,src - model.compile

    run_eagerly:布尔值。默认为假。如果为 True,此模型的逻辑将不会被包裹在 tf.功能。除非您的模型不能在 tf.功能


    关于您的第一个查询,为什么TensorFlowtf.keras.Modelpredict_step 函数内禁用急切执行?

    其中一个主要原因是为您的模型提供最佳性能。它不仅适用于predict_step,还适用于train_steptest_step。基本上tf. keras 模型被编译成静态图。为了使它们以急切模式运行,需要完成上述方法。但请注意,在这种情况下使用 Eager 模式可能会减慢您的训练速度。为了集体利益,tf. keras 模型以图形模式编译。

    【讨论】:

    • 好像我也可以在模型__init__里面设置self.run_eagerly = True,不知道两者会不会有区别?
    • 更新了这个答案。
    【解决方案2】:

    你也可以在编译的时候设置run_eagerly = True,这样也会产生预期的结果。

    model = SimpleModel()
    model.compile(run_eagerly = True)
    pred = model.predict(x)
    

    结果:

    True
    True
    

    【讨论】:

      猜你喜欢
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      • 2021-03-19
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      相关资源
      最近更新 更多