如何在 Tensorflow 2.1.0 中将 Tensor 转换为 Eager 张量?
How to convert a Tensor to Eager tensor in Tensorflow 2.1.0?
我一直在尝试转换类型的张量:
tensorflow.python.framework.ops.Tensor
到 eagertensor:
<class 'tensorflow.python.framework.ops.EagerTensor'>
我一直在寻找解决方案,但找不到。任何帮助将不胜感激。
上下文:
我已经使用 Keras 序列模型的特征提取方法获得了张量。输出是第一个提到的类型的张量。
但是,当我尝试使用 .numpy() 将其转换为 numpy 时,它无法正常工作并出现以下错误:
'Tensor' object has no attribute 'numpy'
但是当我尝试使用 tf.constant 创建张量然后使用 .numpy() 对其进行转换时,它工作正常!
我发现的唯一区别是张量的类型不同:
Keras sequential 生成的张量是上面提到的第一种类型,而我手动创建的第二种张量是第二种类型(Eager tensor)。
如果您能共享可重现的代码,本可以回答得更好。
下面是一个简单的场景,我重现了您的错误。这里我读取的是一个图片文件的路径。
重现错误的代码:
%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'
以下是我在代码中实施的用于修复此错误的步骤。
- 用
tf.py_function(get_path, [x], [tf.string])
装饰了地图功能。您可以找到更多关于 tf.py_function here.
- 现在我可以通过在映射函数中使用
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'>,)
希望这能回答您的问题。
在不同的场景下出现同样的错误,再写一个答案。
您收到的错误是因为版本问题。即tensorflow version 2.1.0
。我通过跳过要安装 tensorflow==2.1.0
和 keras==2.3.1
的前两段来 运行 代码,并且错误没有再次出现。
您的问题在 tensorflow version 2.3.0
的最新版本中消失了。 运行最新版本的程序,这意味着不要再安装tensorflow和keras,因为GoogleColab已经预装了最新稳定的版本。
features.numpy()
输出-
array([[0. , 0.3728346, 0. , ..., 1.0103987, 0. ,
0.4194043]], dtype=float32)
我一直在尝试转换类型的张量:
tensorflow.python.framework.ops.Tensor
到 eagertensor:
<class 'tensorflow.python.framework.ops.EagerTensor'>
我一直在寻找解决方案,但找不到。任何帮助将不胜感激。
上下文:
我已经使用 Keras 序列模型的特征提取方法获得了张量。输出是第一个提到的类型的张量。 但是,当我尝试使用 .numpy() 将其转换为 numpy 时,它无法正常工作并出现以下错误:
'Tensor' object has no attribute 'numpy'
但是当我尝试使用 tf.constant 创建张量然后使用 .numpy() 对其进行转换时,它工作正常!
我发现的唯一区别是张量的类型不同: Keras sequential 生成的张量是上面提到的第一种类型,而我手动创建的第二种张量是第二种类型(Eager tensor)。
如果您能共享可重现的代码,本可以回答得更好。
下面是一个简单的场景,我重现了您的错误。这里我读取的是一个图片文件的路径。
重现错误的代码:
%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'
以下是我在代码中实施的用于修复此错误的步骤。
- 用
tf.py_function(get_path, [x], [tf.string])
装饰了地图功能。您可以找到更多关于 tf.py_function here. - 现在我可以通过在映射函数中使用
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'>,)
希望这能回答您的问题。
在不同的场景下出现同样的错误,再写一个答案。
您收到的错误是因为版本问题。即tensorflow version 2.1.0
。我通过跳过要安装 tensorflow==2.1.0
和 keras==2.3.1
的前两段来 运行 代码,并且错误没有再次出现。
您的问题在 tensorflow version 2.3.0
的最新版本中消失了。 运行最新版本的程序,这意味着不要再安装tensorflow和keras,因为GoogleColab已经预装了最新稳定的版本。
features.numpy()
输出-
array([[0. , 0.3728346, 0. , ..., 1.0103987, 0. ,
0.4194043]], dtype=float32)