【问题标题】:In decorated tf function, I get error: 'Tensor' object has no attribute 'numpy'在装饰的 tf 函数中,我收到错误:“张量”对象没有属性“numpy”
【发布时间】:2020-08-14 19:18:56
【问题描述】:

我已经翻遍了,但找不到任何以前的答案帮助。

我有一个带有 @tf.function 的 tensorflow 模型来进行训练(tf 版本 2.3.0)。在 train_step 调用中,我需要将数据从张量传递到一个 numpy 函数,该函数对其执行 cwt 转换。 (afaik) 没有 tensorflow cwt,因此需要将其传递给 numpy 函数。我遇到的问题是,在 @tf.function 中,张量被绘制成图形,因此不能直接调用 .numpy() 将该张量转换为一个 numpy 数组。小代码sn -p 显示代码,如下。

我的问题是如何将生成的输出数据从生成器调用转换为可以传递给这个 numpy 函数的数据。希望有办法做到这一点!

谢谢。

@tf.function
def train_step(self, true_data):
    noise = tf.random.uniform(shape=[1, 100, 1], minval=0, maxval=1, dtype=tf.float32) 
    with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:
        generated_data = self.generator(noise)
        nump_data = generated_data.numpy()

<this line produces: AttributeError: 'Tensor' object has no attribute 'numpy'>

【问题讨论】:

  • 你运行你的图表了吗?
  • 有快速的方法吗?我是从 PyTorch 过来的,所以我对 Tensorflow 的理解还不够。感谢您的建议!
  • 除了道听途说和一些宽泛的概念性东西外,我真的一无所知。我的理解是,张量只有在会话中评估了它的所有依赖项之后才会有一个 numpy 值。您可能想搜索有关此文档的文档。

标签: python numpy tensorflow tensor


【解决方案1】:

正如你所提到的,根据tf.function 规则,你不能在tf.fucntion 中使用.numpy() 函数。
当使用 eval() 启用图形模式时,您仍然可以采取一些解决方法将 Tensor 转换为 NumPy 数组

以下是修改后的代码,应该对您的事业有所帮助。

@tf.function
def train_step(self, true_data):
    noise = tf.random.uniform(shape=[1, 100, 1], minval=0, maxval=1, dtype=tf.float32) 
    with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:
        generated_data = self.generator(noise)
        nump_data = generated_data.eval(session=tf.compat.v1.Session())  

如果您的代码不需要tf.function,您可以直接使用eager execution enabled 运行它,而不是使用graph mode 运行它,Tensorflow 2.3 version 默认启用即时执行。这样可以避免这些问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-20
    • 2020-06-06
    • 1970-01-01
    • 2018-04-12
    • 2020-08-21
    相关资源
    最近更新 更多