Tensorflow 2.1.0-功能构建代码外部的op正在传递给“图形”张量 [英] Tensorflow 2.1.0 - An op outside of the function building code is being passed a "Graph" tensor

查看:143
本文介绍了Tensorflow 2.1.0-功能构建代码外部的op正在传递给“图形”张量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试执行最近的论文。此实现的一部分涉及从tf 1.14迁移到tf 2.1.0。该代码在tf 1.14上有效,但不再起作用。

I am trying to implement a recent paper. Part of this implementation involves moving from tf 1.14 to tf 2.1.0. The code was working with tf 1.14 but is no longer working.

注意:如果禁用急切执行 tf.compat.v1 .disable_eager_execution()然后代码将按预期工作。

NOTE: If I disable eager execution tf.compat.v1.disable_eager_execution() then the code works as expected.

这是解决方案吗?在 TF 2.x 之前,我已经制作了很多模型,并且从来不必禁用急切的执行以实现正常功能。

Is this the solution? I've made plenty of models before in TF 2.x and never had to disable eager execution to achieve normal functionality.

我已将问题简化为一个简短的摘要,以说明正在发生的事情。

I have distilled the problem to a very short gist that shows what's happening.



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


Link to Gist -- https://gist.github.com/darien-schettler/fd5b25626e9eb5b1330cce670bf9cc17

代码

# version 2.1.0
import tensorflow as tf

# version 1.18.1
import 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  ############ #

# INPUTS
model_input_1 = tf.keras.layers.Input(shape=(160,160,3))
model_input_2 = tf.keras.layers.Input(shape=(160,160,3))

# OUTPUTS
model_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)

# MODEL
model = 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 passed
a "Graph" tensor. It is possible to have Graph tensors
leak out of the function building context by including a
tf.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 * 2
The graph tensor has name: conv_name_base_1/Identity:0

During 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.0
import tensorflow as tf

# version 1.18.1
import 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  ############ #

# INPUTS
model_input_1 = tf.keras.layers.Input(shape=(160,160,3))
model_input_2 = tf.keras.layers.Input(shape=(160,160,3))

# OUTPUTS
model_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])

# MODEL
model = 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<<<<

# ############################################################# #

想法?

预先感谢!

让我知道您是否希望我提供其他服务。

Let me know if you would like me to provide anything else.

推荐答案

您可以尝试以下步骤:


  1. 按以下方式更改 resize_like

def resize_like(inputs):
    input_tensor, ref_tensor = inputs
    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


  • 然后,在 Lambda 层中:

    model_output_2 = tf.keras.layers.Lambda(function=resize_like)([model_input_2, model_output_1])
    


  • 这篇关于Tensorflow 2.1.0-功能构建代码外部的op正在传递给“图形”张量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆