Tensorflow: TF 2.0 'Tensor' 对象在使用 .numpy() 时没有属性 'numpy' 尽管默认情况下启用了急切执行

创建于 2019-04-04  ·  54评论  ·  资料来源: tensorflow/tensorflow

尽管默认情况下在 TF 2.0 中启用了 Eager_execution,但我在使用 .numpy() 时遇到错误

请注意,我没有在与 TF 1.0 兼容的模式下使用代码。

expt = [[[ 0, 0, 0],
[ 4, 71, 141],
[ 0, 0, 0]],

       [[ 83,  25,  85],
        [ 90, 190, 143],
        [  4, 141,  49]],

       [[  0,   0,   0],
        [  4,  71,  49],
        [  0,   0,   0]]]

expt = tf.convert_to_tensor(expt)

预期值 = expt.numpy()

AttributeError: 'Tensor' 对象没有属性 'numpy'

TensorFlow 2.0 的 CPU 测试版。

Fixed in Nightly TF 2.0 core awaiting response support

最有用的评论

我遇到过同样的问题。 原来我试图在@tf.function 中使用 .numpy()。 据我了解 tf.function 并不是出于性能目的而急切地执行。 如果我删除 @tf.function 装饰器 .numpy() 工作。

所有54条评论

@ Mainak431你的问题解决了吗?

是的。

你的解决方案是什么?

.Numpy 仅在 Eager 模式下受支持。 如果您处于图形模式,则不支持。 检查,如果您处于急切模式。 做,tf.eagerly()。 它返回真或假。 在图形模式下,您必须在会话中使用 eval 来获取 numpy 数组中张量的值。

@Mainak431
模块 'tensorflow' 没有属性 'eagerly'
模块 'tensorflow.compat.v1' 没有属性 'eagerly'

我正在使用包 tensorflow-gpu==2.0.0-alpha0
我的一个张量上的 .numpy() 产生 'Tensor' 对象没有属性 'numpy'

tf.eagerly() 给出模块“tensorflow”没有属性“eagerly”

tf.executing_eagerly() 而不是 tf.eagerly() 为我工作以检查我是否处于急切模式

有没有人为此找到解决方案?

同样的问题……我在 Eager 模式下调用了一个 keras 模型,我得到了一个张量,而不是一个 EagerTensor,这会导致 OpenAI Gym 出现问题

运行这个 tf.enable_eager_execution() 然后当你尝试 tf.executing_eagerly() 它应该给 True。 在此之后,您可以使用 something.numpy() 查看值。

@AkashNagaraj我刚刚提交了一个问题,其中代码正在急切地执行(并且应该,因为它是 TF 2.0),但是我遇到了“缺少 numpy”的问题。 你愿意看一看吗? https://github.com/tensorflow/tensorflow/issues/32842

谢谢!

我遇到过同样的问题。 原来我试图在@tf.function 中使用 .numpy()。 据我了解 tf.function 并不是出于性能目的而急切地执行。 如果我删除 @tf.function 装饰器 .numpy() 工作。

我遇到过同样的问题。 原来我试图在@tf.function 中使用 .numpy()。 据我了解 tf.function 并不是出于性能目的而急切地执行。 如果我删除 @tf.function 装饰器 .numpy() 工作。

这对我有用,@tf.function 将整个函数变成了图形模式

为什么这个线程中没有提到一个解决方案=.=

我的函数没有装饰器,但 .numpy() 仍然像以前的海报所描述的那样失败。 有没有人找到解决方案?

我发现在我的脚本顶部插入 tf.compat.v1.enable_eager_execution() 后我的问题就解决了(与以前的海报所说的非常相似,但这适用于 TF 2.0)...

我遇到了同样的问题,上述解决方案都不适用于我。

我使用的是 TF 2.0,我的函数没有装饰器,tf.eagerly() 返回 True 并且我仍然得到相同的 AttributeError: 'Tensor' object has no attribute 'numpy'。

同样的问题。

我确保我正在急切地执行并且在我的自定义损失函数上没有装饰器。 我还尝试了迈克尔的解决方案两个评论,但没有用。

我收到错误:AttributeError: 'Tensor' object has no attribute 'numpy'

我注意到只有在模型拟合期间尝试将张量转换为 numpy 时才会出现此错误。 我最好的猜测是它似乎是形状问题。

例如,下面的张量

tf.Tensor([[1 3] [0 4]], shape=(2, 2), dtype=int64)

可以使用 .numpy() 进行转换。 但是,当尝试为分类问题实现自定义指标时,y_true.numpy() 和 y_pred.numpy() 都会引发

AttributeError: 'Tensor' 对象没有属性 'numpy'。

这是两个 y 的一个示例:

y_true:
打印(y_true):张量(“密集目标:0 ”,形状=(无,无,无),dtype=float32)
打印(类型(y_true)):

y_pred:
打印(y_pred):张量(“密集/身份:0 ”,形状=(无,无,6),dtype=float32)
打印(类型(预测)):

@renatomello我和你有同样的问题。 我打开了一个新问题:#35393。

@renatomello尝试实施自定义指标时问题仍然存在。 你找到解决方法了吗?

@renatomello尝试实施自定义指标时问题仍然存在。 你找到解决方法了吗?

不,我没有。 我想看看是否有一个 TF/Keras 后端功能可以做类似的事情,我可以使用。 否则,我只需要自己创建一个。

我在数据预处理中使用正则表达式函数时遇到了这个领域。 使用 python 逻辑需要使用tf.py_function中提到的文档和这个StackOverflow 线程(注意tf.py_func()现在是tf.py_function()

一旦我改变了我的代码
data = fnames.map(process_path)

data = fnames.map(lambda x: tf.py_function(process_path, [x], [tf.string]))
代码正确执行。

我在 TF2.1 中使用非常自定义的split尝试TextVectorization层时遇到了这个问题。 对我来说修复它的是将dynamic=True传递给TextVectorization构造。

我注意到只有在模型拟合期间尝试将张量转换为 numpy 时才会出现此错误。 我最好的猜测是它似乎是形状问题。

例如,下面的张量

tf.Tensor([[1 3] [0 4]], shape=(2, 2), dtype=int64)

可以使用 .numpy() 进行转换。 但是,当尝试为分类问题实现自定义指标时,y_true.numpy() 和 y_pred.numpy() 都会引发

AttributeError: 'Tensor' 对象没有属性 'numpy'。

这是两个 y 的一个示例:

y_true:
打印(y_true):张量(“密集目标:0 ”,形状=(无,无,无),dtype=float32)
打印(类型(y_true)):

y_pred:
打印(y_pred):张量(“密集/身份:0 ”,形状=(无,无,6),dtype=float32)
打印(类型(预测)):

不知道原因,但我通过添加解决了这个问题
experimental_run_tf_function=False
在我的模型的编译功能中。

我注意到只有在模型拟合期间尝试将张量转换为 numpy 时才会出现此错误。 我最好的猜测是它似乎是形状问题。
例如,下面的张量

tf.Tensor([[1 3] [0 4]], shape=(2, 2), dtype=int64)
可以使用 .numpy() 进行转换。 但是,当尝试为分类问题实现自定义指标时,y_true.numpy() 和 y_pred.numpy() 都会引发
AttributeError: 'Tensor' 对象没有属性 'numpy'。
这是两个 y 的一个示例:
y_true:
打印(y_true):张量(“密集目标:0 ”,形状=(无,无,无),dtype=float32)
打印(类型(y_true)):
y_pred:
打印(y_pred):张量(“密集/身份:0 ”,形状=(无,无,6),dtype=float32)
打印(类型(预测)):

不知道原因,但我通过添加解决了这个问题
experimental_run_tf_function=False
在我的模型的编译功能中。

在我的情况下似乎没有什么不同

我在 TF2.1 中使用非常自定义的split尝试TextVectorization层时遇到了这个问题。 对我来说修复它的是将dynamic=True传递给TextVectorization构造。

你是怎么做到的?

首先,您应该按如下方式注册会话:
sess=tf.Session()
然后..使用:
预期值 = expt.eval(session=sess)
结果应该是:
打印(预期值)
出[41]:
数组([[[ 0, 0, 0],
[ 4, 71, 141],
[ 0, 0, 0]]])
感谢

我在 TF2.1 中使用非常自定义的split尝试TextVectorization层时遇到了这个问题。 对我来说修复它的是将dynamic=True传递给TextVectorization构造。

你是怎么做到的?

像这样。 总的来说,我仍在学习 ML/TF,所以这可能是错误的做法。 在它“正常工作”之前,这一切都是黑魔法。

vectorize_layer = tf.keras.layers.experimental.preprocessing.TextVectorization(
    standardize=tf_custom_standardize,
    split=tf_custom_split,
    max_tokens=len(vocab)+1,
    output_mode='int',
    dynamic=True
)

这个问题对我来说仍然存在。 我没有使用 @tf.function 注释并急切地执行。 我现在使用的解决方法是 np.array(yourtensor.to_list())

这个问题对我来说仍然存在。 我没有使用 @tf.function 注释并急切地执行。 我现在使用的解决方法是 np.array(yourtensor.to_list())

这就是我得到的
AttributeError: 'Tensor' object has no attribute 'to_list'

根据tensorflow中的代码,当tensor对象处于eager模式tensor(tensorflow.python.framework.ops.EagerTensor)时,我们可以调用tesnsorObj.numpy()
这个方法在tensorflow/python/framework/ops.py中实现
但是如果tensor对象是一个通用的tensor,比如属于tensorflow.python.framework.ops.Tensor,那么它就没有numpy()方法,实现代码也在tensorflow/python/framework/ops.py
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/framework/ops.py

这意味着在@tf.function 中运行的所有张量对象都无法调用 tensorObj.numpy()
急切运行模式为 TF2.0 增加了灵活性,也增加了它的复杂性。

根据tensorflow中的代码,当tensor对象处于eager模式tensor(tensorflow.python.framework.ops.EagerTensor)时,我们可以调用tesnsorObj.numpy()
这个方法在tensorflow/python/framework/ops.py中实现
但是如果tensor对象是一个通用的tensor,比如属于tensorflow.python.framework.ops.Tensor,那么它就没有numpy()方法,实现代码也在tensorflow/python/framework/ops.py
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/framework/ops.py

这意味着在@tf.function 中运行的所有张量对象都无法调用 tensorObj.numpy()
急切运行模式为 TF2.0 增加了灵活性,也增加了它的复杂性。

谢谢详细的解释。

但是,这个问题在稳定的 2.1.0 版本中并没有解决。 在#38038 中向我指出它已在 tf-nightly 2.2.0 版本中解决。

@renatomello我是 TF 的完全新手。 因此,我不确定以下内容是否有助于解决您的问题。
我通过使用Experiment_run_functions_eagerly(True)解决了错误AttributeError: 'Tensor' object has no attribute 'numpy'
我用的是TF版本。 2.1(有关详细版本信息,请参阅下面的控制台输出)。 我允许解释我用这段代码做什么:

import sys
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np

counter=0

class MyDense(layers.Dense):
  def __init__(self, units, activation,input_shape):
    super().__init__(units=units, activation=activation,input_shape=input_shape)

  def call(self, inputs):
      global counter

      counter += 1
      print('\n{}. inputs.numpy()='.format(counter))
      if hasattr(inputs,'numpy'):
          print('{}'.format(inputs.numpy()))
      else:
          print('not available.')

      return super().call(inputs)

def test(run_eagerly):
    print('\n*** *** *** test(run_eagerly={})'.format(run_eagerly))
    tf.config.experimental_run_functions_eagerly(run_eagerly)

    dim0=256
    dim1=24
    train = np.arange(dim0*dim1).reshape(dim0,dim1)
    label = np.ones(dim0)

    model = tf.keras.Sequential()
    model.add(MyDense(10,activation='softmax',input_shape=(dim1,)))

    model.compile(optimizer=tf.keras.optimizers.SGD(),
                  loss=tf.keras.losses.SparseCategoricalCrossentropy())

    model.fit(train,
              label,
              batch_size=dim0,
              epochs=1)

print("Python version")
print (sys.version)
print("TensorFlow version")
print(tf.__version__)
print('\n\n')

test(False)
test(True)

我在编辑器 Spyder 的控制台(Spyder 版本 4.0.1)中执行上述代码。 相应的控制台输出是(只是输出的一部分):

Python version
3.7.6 (default, Jan  8 2020, 19:59:22) 
[GCC 7.3.0]
TensorFlow version
2.1.0

*** *** *** test(run_eagerly=False)

1. inputs.numpy()=
not available.
Train on 256 samples

2. inputs.numpy()=
not available.

3. inputs.numpy()=
not available.
256/256 [==============================] - 0s 899us/sample - loss: 6344.8682

*** *** *** test(run_eagerly=True)

4. inputs.numpy()=
not available.
Train on 256 samples

5. inputs.numpy()=
[[2328. 2329. 2330. ... 2349. 2350. 2351.]
 [5280. 5281. 5282. ... 5301. 5302. 5303.]
 [2208. 2209. 2210. ... 2229. 2230. 2231.]
 ...
 [5160. 5161. 5162. ... 5181. 5182. 5183.]
 [ 840.  841.  842. ...  861.  862.  863.]
 [6048. 6049. 6050. ... 6069. 6070. 6071.]]
256/256 [==============================] - 0s 132us/sample - loss: 16.1181

现在,在test(run_eagerly=False)下方的控制台输出中看到:所有三个 MyDense.call() 调用状态,该 input.numpy() 不可用(旁注:当我理解正确时,前两个 MyDense.call () 调用仅用于构建模型。因此,有意义的是,它们没有可用的 input.numpy()。)。 所以,这是有意义的。
test(run_eagerly=True)下方的控制台输出中查看:在第五个 MyDense.call() 中是 input.numpy() 可用。 所以,这也是有意义的。 它解决了错误。

我遇到过同样的问题。 原来我试图在@tf.function 中使用 .numpy()。 据我了解 tf.function 并不是出于性能目的而急切地执行。 如果我删除 @tf.function 装饰器 .numpy() 工作。

这个对我有用。

我已经尝试了该线程中提到的所有解决方案,但没有一个对我有用。 我在 2.2.0-rc2 上。

就我而言,急切执行似乎不是问题。 当我调用keras.backend.get_value()时,错误来自这些行:

  if context.executing_eagerly() or isinstance(x, ops.EagerTensor):
    return x.numpy()

有同样的问题。 事实证明,在模型上运行拟合函数时,默认情况下会禁用急切执行。 为了解决这个问题,您可以在运行 model.fit 之前运行: model.run_eagerly = True
这对我来说在 Tensorflow 2.2 上很有魅力

model.compile(..., run_eagerly=True) 在创建自定义指标时对我有用

我在使用 Keras 时遇到了类似的问题。
我不知道这是否会帮助其他人,但以下帮助了我:
我正在使用:
模型 = Sequential() 之前并将其更改为
模型 = tf.keras.Sequential()
它对我有用。

@ Mainak431你介意重新打开这个问题吗?

我在使用 Keras 时遇到了类似的问题。
我不知道这是否会帮助其他人,但以下帮助了我:
我正在使用:
模型 = Sequential() 之前并将其更改为
模型 = tf.keras.Sequential()
它对我有用。

这实际上是我的解决方案,我重用了一些直接从 keras 导入的旧代码,而不是 tensorflow.keras 层等。更改导入语句解决了属性错误。

@Blubbaa在这里也一样。 这是唯一对我有用的东西。

如果我想检查张量中的值,但由于tf.placeholder兼容性而不得不禁用 Eager 模式,我该怎么办? 我试图在没有tf.placeholder的图层之间添加tf.enable_eager_execution tf.placeholder只是为了得到这个错误ValueError: tf.enable_eager_execution must be called at program startup.

以下代码有效:

def parse_str(str_tensor):
    raw_string = str_tensor.numpy().decode("utf-8") 

    # play with raw string
    raw_string = 'AAA'+raw_string     
    return raw_string

调用解析函数:

def tf_pre_processing(row):
  return tf.py_function(parse_str, [row['context']], [tf.string])


train = t.map(tf_pre_processing).batch(1).take(1)

list(train)

@ Mainak431原始代码按预期工作。 是要点。

@tu1258您不需要禁用急切执行。 只需将其导入为tf.compat.v1.placeholder而不是tf.placeholder 。 如果它仍然不起作用,那么请共享一个独立的代码来重现该问题。

如果还有其他问题,请告诉我。 谢谢!

我遇到过同样的问题。 原来我试图在@tf.function 中使用 .numpy()。 据我了解 tf.function 并不是出于性能目的而急切地执行。 如果我删除 @tf.function 装饰器 .numpy() 工作。

我认为 Tensorflow2.x 中的以下选项可以提供帮助
tf.config.run_functions_eagerly

你调用tf.function的地方,你可以尝试急切执行,然后禁用tf.function的急切执行。

我是 tensorflow 的新手,但是按照本教程(在 Jupyter Notebook 上) https://www.tensorflow.org/tutorials/quickstart/beginner?hl=en会给你错误

predictions = model(x_train[:1]).numpy()
Tensor object has no attribute 'numpy'

@louisnot我无法重现该错误。 请在此处查看

如果您遇到错误,能否分享一个要点? 谢谢!

我在使用 gist 时没有遇到任何问题。

我正在关闭这个问题,因为它已在tf-nightly得到解决。 如果问题仍然存在,请随时重新打开。 谢谢!

@bhupendrathore你能用一个简单的独立代码打开一个新问题来重现错误吗? 谢谢!

我遇到了同样的问题; 当我在您的解决方案中使用pip install tf-nightly修复它时,会发生错误:

ERROR: Could not find a version that satisfies the requirement tf-nightly (from versions: none)
ERROR: No matching distribution found for tf-nightly

@jvishnuvardhan

@liangzelang我看到你又开了一个新问题。 我们会在那里解决它。 谢谢

此页面是否有帮助?
0 / 5 - 0 等级