【问题标题】:How to convert a Tensor to Eager tensor in Tensorflow 2.1.0?如何在 Tensorflow 2.1.0 中将张量转换为渴望张量?
【发布时间】:2020-10-22 02:08:40
【问题描述】:

我一直在尝试转换类型的张量:

tensorflow.python.framework.ops.Tensor

到一个急切的张量:

<class 'tensorflow.python.framework.ops.EagerTensor'>

我一直在寻找解决方案,但找不到。任何帮助将不胜感激。

上下文:

我使用 Keras Sequential 模型中的特征提取方法获得了张量。输出是第一个提到的类型的张量。 但是,当我尝试使用 .numpy() 将其转换为 numpy 时,它无法正常工作并出现以下错误:

'Tensor' object has no attribute 'numpy'

但是当我尝试使用 tf.constant 创建张量,然后使用 .numpy() 对其进行转换时,它工作正常!

我发现的唯一区别是张量的类型不同: Keras 序列生成的张量属于上面提到的第一种类型,而我手动创建的第二种张量属于第二种类型(Eager tensor)。

【问题讨论】:

  • 嗯,基本上我想转换为 Eagertensor 以便我可以使用 .numpy()。
  • 我已经为我的问题添加了上下文,我不知道这是否会有所帮助。
  • EagerTensors 隐式转换为 Tensors。更准确地说,创建了一个新的 Tensor 对象,并将值复制到新的张量中。 TF 根本不修改张量内容;它总是创建新的张量。新张量的类型取决于创建它的行是否在 Eager 模式下执行。
  • 请分享可重现的代码。

标签: python tensorflow2.0


【解决方案1】:

在不同情况下出现相同错误时再写一个答案。

您遇到的错误是由于版本问题。即tensorflow version 2.1.0。我跳过了安装tensorflow==2.1.0keras==2.3.1的前2段来运行代码,并且错误没有再次出现。

您的问题在最新版本的tensorflow version 2.3.0 中消失了。在最新版本上运行程序,这意味着不要再次安装 tensorflow 和 keras,因为 Google Colab 已经预先安装了最新且稳定的版本。

features.numpy()

输出 -

array([[0.       , 0.3728346, 0.       , ..., 1.0103987, 0.       ,
        0.4194043]], dtype=float32)

【讨论】:

    【解决方案2】:

    如果您能分享可重现的代码,可能会得到更好的回答。

    下面是一个简单的场景,我重新创建了您的错误。这里我正在读取一个图像文件的路径。

    重现错误的代码:

    %tensorflow_version 2.x
    import tensorflow as tf
    import numpy as np
    
    def get_path(file_path):
        print("file_path: ", bytes.decode(file_path.numpy()),type(bytes.decode(file_path.numpy())))
        return file_path
    
    train_dataset = tf.data.Dataset.list_files('/content/bird.png')
    train_dataset = train_dataset.map(lambda x: (get_path(x)))
    
    for one_element in train_dataset:
        print(one_element)
    

    输出:

    ---------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call last)
    <ipython-input-8-2d5db8425f67> in <module>()
          8 
          9 train_dataset = tf.data.Dataset.list_files('/content/bird.png')
    ---> 10 train_dataset = train_dataset.map(lambda x: (get_path(x)))
         11 
         12 for one_element in train_dataset:
    
    10 frames
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/autograph/impl/api.py in wrapper(*args, **kwargs)
        256       except Exception as e:  # pylint:disable=broad-except
        257         if hasattr(e, 'ag_error_metadata'):
    --> 258           raise e.ag_error_metadata.to_exception(e)
        259         else:
        260           raise
    
    AttributeError: in user code:
    
        <ipython-input-8-2d5db8425f67>:10 None  *
            train_dataset = train_dataset.map(lambda x: (get_path(x)))
        <ipython-input-8-2d5db8425f67>:6 get_path  *
            print("file_path: ", bytes.decode(file_path.numpy()),type(bytes.decode(file_path.numpy())))
    
        AttributeError: 'Tensor' object has no attribute 'numpy'
    

    以下是我在代码中实施的用于修复此错误的步骤。

    1. 已用tf.py_function(get_path, [x], [tf.string]) 修饰了地图功能。您可以找到更多关于 tf.py_function here
    2. 现在我可以通过在 map 函数中使用 bytes.decode(file_path.numpy()) 来获取字符串部分。

    固定代码:

    %tensorflow_version 2.x
    import tensorflow as tf
    import numpy as np
    
    def get_path(file_path):
        print("file_path: ",bytes.decode(file_path.numpy()),type(bytes.decode(file_path.numpy())))
        return file_path
    
    train_dataset = tf.data.Dataset.list_files('/content/bird.jpg')
    train_dataset = train_dataset.map(lambda x: tf.py_function(get_path, [x], [tf.string]))
    
    for one_element in train_dataset:
        print(one_element)
    

    输出:

    file_path:  /content/bird.jpg <class 'str'>
    (<tf.Tensor: shape=(), dtype=string, numpy=b'/content/bird.jpg'>,)
    

    希望这能回答你的问题。

    【讨论】:

    • 感谢您的解释,但我认为我得到的错误是由于其他原因,这是一个 colab 笔记本,可以在类似情况下重现错误:colab.research.google.com/drive/…
    • @hamza-boulahia - 我查看了您的代码,为您的问题再写了一个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 2021-11-19
    • 2016-10-15
    • 1970-01-01
    • 2019-01-20
    • 2020-06-27
    相关资源
    最近更新 更多