TensorFlow 2.0/Keras中模型与Layer默认执行模式及装饰器影响咨询
问题1:TensorFlow 2.0中,层(Layer)与模型的默认执行模式是eager mode还是graph mode?
默认是eager mode。TensorFlow 2.x 将eager execution设为默认运行模式,无需手动开启,所有层和模型在未做特殊配置时都会以该模式执行。问题2:在Keras TensorFlow环境下,若未显式指定执行模式,继承自tf.keras.models.Model的模型默认以何种模式运行?继承自tf.keras.layers.Layer的层同理是哪种模式?
不管是继承自tf.keras.models.Model的模型,还是继承自tf.keras.layers.Layer的层,默认都以eager mode运行,只要没有显式切换模式或者给call方法添加@tf.function装饰器。问题3:根据TensorFlow官方文档所述,为模型添加@tf.function装饰器可指定图执行,是否意味着模型的call方法未加该装饰器时默认以eager mode运行?层是否也是如此?
没错,模型的call方法未加@tf.function时默认走eager mode;层的call方法也是同样逻辑。不过有个例外场景:当调用model.fit()、model.evaluate()这类高阶API时,TensorFlow会自动将模型执行转换为graph mode做性能优化,但如果是直接调用model(input_data)这种方式执行,没加装饰器就还是eager mode。问题4:若仅在某个层的call方法添加@tf.function装饰器,而其所属模型未添加,是否仅该层以graph mode运行,模型其余部分以eager mode运行?
是的,只有这个加了@tf.function装饰器的层的call方法会以graph mode执行,模型的其他部分(包括其他层的call方法、模型自身的call逻辑)都会保持eager mode运行。实际执行时,该层的计算图会被单独构建,和其他eager模式的代码正常交互。
内容的提问来源于stack exchange,提问作者Aviraj Bevli

