Tensorflow 2.1.0 – 函数构建代码之外的操作正在传递一个“Graph”张量

我在尝试实现一篇最近的论文。实现的一部分涉及从tf 1.14升级到tf 2.1.0。代码在tf 1.14下可以正常工作,但在tf 2.1.0下不再工作。


注意:如果我禁用即时执行tf.compat.v1.disable_eager_execution(),代码可以按预期工作。

这是解决方案吗?我之前用TF 2.x制作过很多模型,从未需要禁用即时执行来实现正常功能。


我已经将问题简化为一个非常简短的示例,展示了发生的情况。

链接和代码在前,详细的错误消息在后

链接到Gist — https://gist.github.com/darien-schettler/fd5b25626e9eb5b1330cce670bf9cc17

代码

# version 2.1.0import tensorflow as tf# version 1.18.1import numpy as np# ######## DEFINE CUSTOM FUNCTION FOR TF LAMBDA LAYER  ######## #def resize_like(input_tensor, ref_tensor):    """ Resize an image tensor to the same size/shape as a reference image tensor    Args:        input_tensor : (image tensor) Input image tensor that will be resized        ref_tensor   : (image tensor) Reference image tensor that we want to resize the input tensor to.    Returns:        reshaped tensor    """    reshaped_tensor = tf.image.resize(images=input_tensor,                                      size=tf.shape(ref_tensor)[1:3],                                      method=tf.image.ResizeMethod.NEAREST_NEIGHBOR,                                      preserve_aspect_ratio=False,                                      antialias=False,                                      name=None)    return reshaped_tensor# ############################################################# ## ############ DEFINE MODEL USING TF.KERAS FN API  ############ ## INPUTSmodel_input_1 = tf.keras.layers.Input(shape=(160,160,3))model_input_2 = tf.keras.layers.Input(shape=(160,160,3))# OUTPUTSmodel_output_1 = tf.keras.layers.Conv2D(filters=64,                                         kernel_size=(1, 1),                                         use_bias=False,                                        kernel_initializer='he_normal',                                        name='conv_name_base')(model_input_1)model_output_2 = tf.keras.layers.Lambda(function=resize_like,                                        arguments={'ref_tensor': model_output_1})(model_input_2)# MODELmodel = tf.keras.models.Model(inputs=[model_input_1, model_input_2],                                      outputs=model_output_2,                                      name="test_model")# ############################################################# ## ######### TRY TO UTILIZE PREDICT WITH DUMMY INPUT  ########## #dummy_input = [np.ones((1,160,160,3)), np.zeros((1,160,160,3))]model.predict(x=dummy_input) # >>>>ERROR OCCURS HERE<<<<# ############################################################# #

完整错误

>>> model.predict(x=dummy_input) # >>>>ERROR OCCURS HERE<<<<Traceback (most recent call last):  File "/Users/<username>/.virtualenvs/<venv-name>/lib/python3.7/site-packages/tensorflow_core/python/eager/execute.py", line 61, in quick_execute    num_outputs)TypeError: An op outside of the function building code is being passeda "Graph" tensor. It is possible to have Graph tensorsleak out of the function building context by including atf.init_scope in your function building code.For example, the following function will fail:  @tf.function  def has_init_scope():    my_constant = tf.constant(1.)    with tf.init_scope():      added = my_constant * 2The graph tensor has name: conv_name_base_1/Identity:0During handling of the above exception, another exception occurred:Traceback (most recent call last):  File "<stdin>", line 1, in <module>  File "/Users/<user-name>/.virtualenvs/<venv-name>/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training.py", line 1013, in predict    use_multiprocessing=use_multiprocessing)  File "/Users/<user-name>/.virtualenvs/<venv-name>/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py", line 498, in predict    workers=workers, use_multiprocessing=use_multiprocessing, **kwargs)  File "/Users/<user-name>/.virtualenvs/<venv-name>/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py", line 475, in _model_iteration    total_epochs=1)  File "/Users/<user-name>/.virtualenvs/<venv-name>/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py", line 128, in run_one_epoch    batch_outs = execution_function(iterator)  File "/Users/<user-name>/.virtualenvs/<venv-name>/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2_utils.py", line 98, in execution_function    distributed_function(input_fn))  File "/Users/<user-name>/.virtualenvs/<venv-name>/lib/python3.7/site-packages/tensorflow_core/python/eager/def_function.py", line 568, in __call__    result = self._call(*args, **kwds)  File "/Users/<user-name>/.virtualenvs/<venv-name>/lib/python3.7/site-packages/tensorflow_core/python/eager/def_function.py", line 638, in _call    return self._concrete_stateful_fn._filtered_call(canon_args, canon_kwds)  # pylint: disable=protected-access  File "/Users/<user-name>/.virtualenvs/<venv-name>/lib/python3.7/site-packages/tensorflow_core/python/eager/function.py", line 1611, in _filtered_call    self.captured_inputs)  File "/Users/<user-name>/.virtualenvs/<venv-name>/lib/python3.7/site-packages/tensorflow_core/python/eager/function.py", line 1692, in _call_flat    ctx, args, cancellation_manager=cancellation_manager))  File "/Users/<user-name>/.virtualenvs/<venv-name>/lib/python3.7/site-packages/tensorflow_core/python/eager/function.py", line 545, in call    ctx=ctx)  File "/Users/<user-name>/.virtualenvs/<venv-name>/lib/python3.7/site-packages/tensorflow_core/python/eager/execute.py", line 75, in quick_execute    "tensors, but found {}".format(keras_symbolic_tensors))tensorflow.python.eager.core._SymbolicException: Inputs to eager execution function cannot be Keras symbolic tensors, but found [<tf.Tensor 'conv_name_base_1/Identity:0' shape=(None, 160, 160, 64) dtype=float32>]

我想到的一个潜在解决方案是用自定义层替换Lambda层…这似乎也可以解决问题。不过,我不确定这方面的最佳实践。代码如下。


# version 2.1.0import tensorflow as tf# version 1.18.1import numpy as np# ######## DEFINE CUSTOM LAYER DIRECTLY BY SUBCLASSING  ######## #class ResizeLike(tf.keras.layers.Layer):    """ tf.keras layer to resize a tensor to the reference tensor shape.    Attributes:        keras.layers.Layer: Base layer class.            This is the class from which all layers inherit.                -   A layer is a class implementing common neural networks                    operations, such as convolution, batch norm, etc.                -   These operations require managing weights,                    losses, updates, and inter-layer connectivity.    """    def __init__(self, **kwargs):        super().__init__(**kwargs)    def call(self, inputs, **kwargs):        """TODO: docstring        Args:            inputs (TODO): TODO        **kwargs:            TODO        Returns:            TODO        """        input_tensor, ref_tensor = inputs        return self.resize_like(input_tensor, ref_tensor)    def resize_like(self, input_tensor, ref_tensor):        """ Resize an image tensor to the same size/shape as a reference image tensor        Args:            input_tensor: (image tensor) Input image tensor that will be resized            ref_tensor: (image tensor) Reference image tensor that we want to resize the input tensor to.        Returns:            reshaped tensor        """        reshaped_tensor = tf.image.resize(images=input_tensor,                                          size=tf.shape(ref_tensor)[1:3],                                          method=tf.image.ResizeMethod.NEAREST_NEIGHBOR,                                          preserve_aspect_ratio=False,                                          antialias=False)        return reshaped_tensor# ############################################################# ## ############ DEFINE MODEL USING TF.KERAS FN API  ############ ## INPUTSmodel_input_1 = tf.keras.layers.Input(shape=(160,160,3))model_input_2 = tf.keras.layers.Input(shape=(160,160,3))# OUTPUTSmodel_output_1 = tf.keras.layers.Conv2D(filters=64,                                         kernel_size=(1, 1),                                         use_bias=False,                                        kernel_initializer='he_normal',                                        name='conv_name_base')(model_input_1)model_output_2 = ResizeLike(name="resize_layer")([model_input_2, model_output_1])# MODELmodel = tf.keras.models.Model(inputs=[model_input_1, model_input_2],                                      outputs=model_output_2,                                      name="test_model")# ############################################################# ## ######### TRY TO UTILIZE PREDICT WITH DUMMY INPUT  ########## #dummy_input = [np.ones((1,160,160,3)), np.zeros((1,160,160,3))]model.predict(x=dummy_input) # >>>>ERROR OCCURS HERE<<<<# ############################################################# #

有什么想法吗?

提前谢谢了!

如果您需要我提供其他任何东西,请告诉我。


回答:

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注