【问题标题】:Tensorflow2.0 - How to convert Tensor to numpy() arrayTensorflow2.0 - 如何将张量转换为 numpy() 数组
【发布时间】:2020-01-19 08:58:49
【问题描述】:

我正在运行 tf2.0,根本无法打印混淆矩阵值。问题描述如下。

  @tf.function
  def test_step(self, x , y):
    predictions = model(x, training=False)
    loss = self.loss(y, predictions)

    y, predictions = tf.reshape(y,[-1,]), tf.reshape(predictions, [-1,])

    # Cast into class labels
    predictions = math_ops.cast(predictions > 0.5, predictions.dtype)

    ....

    self.test_conf_matrix = tf.math.confusion_matrix(y, predictions, num_classes=2) <--- important line!

到目前为止一切顺利,混淆矩阵将被正确计算。

但根本不可能像这样打印出来:

print(str(self.test_conf_matrix.numpy()))

我得到的错误是:

AttributeError: 'Tensor' object has no attribute 'numpy'

但是既然 tf2 和 eagerExecution 这应该是这样做的,对吧?见:TF2.0 Tutorial

【问题讨论】:

  • math_ops 是什么。你从哪里导入的?
  • 它来自'from tensorflow.python.ops import math_ops'。因为例如tfa 的 F1-Score 实现不适用于概率。所以我看了一下 tensorflows 的准确性实现,这就是他们将概率转换为类标签的方式。

标签: python tensorflow machine-learning deep-learning


【解决方案1】:

根据tf.function的定义,

“将函数编译成可调用的 TensorFlow 图”。

由于 tf.function 强加了 TensorFlow 图,因此您不能使用 tf.* 方法之外的任何内容。

这意味着任何 Python 代码都不能在 tf.function 中使用,只能在 tf.* 方法中使用。

当您想使用 map 函数迭代 tf.data.Dataset 时,会发生同样的现象。您要在tf.data.Dataset 上使用的map 函数不能包含任意python 代码,除非您专门使用tf.py_function

出于性能原因,这些操作专门在图形模式下执行,因此,您不能调用属于“急切执行”类别的方法,例如.numpy()

【讨论】:

  • 所以,谢谢,但我真的不明白。 tf.math.confusion_matrix 的文档说它返回一个张量,这就是它的作用。因此,当我查看 Tensor 的文档时,描述了 .numpy() 函数。您对如何解决这个问题有什么建议吗?
  • 你不能。您不能在 TensorFlow 图中使用的函数中使用 .numpy()。
  • 您可以使用 .numpy() 左右的唯一方法是调用/创建特定的 py_fuunction。 .nu​​mpy() 存在于张量的文档中这一事实并不意味着您可以在任何地方应用它:D
  • Haben Sie verstanden?
  • 不,不完全。因为我可以处理任何其他评估指标,例如 tf.keras.metrics.BinaryAccuracy。那么你有一个解决方案如何从混淆矩阵中得到结果吗?我不明白这些评估指标之一和混淆矩阵之间的区别。为什么我可以打印/评估除混淆矩阵之外的所有其他指标?
猜你喜欢
  • 2021-01-08
  • 1970-01-01
  • 2021-10-17
  • 2018-11-28
  • 2019-06-13
  • 2019-03-19
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多