为啥numpy点积函数在传递两个TensorFlow变量对象时会返回错误?

Posted

技术标签:

【中文标题】为啥numpy点积函数在传递两个TensorFlow变量对象时会返回错误?【英文标题】:Why does the numpy dot product function returns an error when passed two TensorFlow Variable objects?为什么numpy点积函数在传递两个TensorFlow变量对象时会返回错误? 【发布时间】:2021-09-21 23:00:48 【问题描述】:
import tensorflow as tf
import numpy as np

a = tf.Variable([[12, 13], [12, 13]])
b = tf.Variable([[12, 13], [12, 13]])

print(np.dot(a, b))

以上代码返回错误:

TypeError: __array__() takes 1 positional argument but 2 were given.

我知道 TensorFlow 有一个用于矩阵乘法的内置方法,但我很好奇为什么 np.dot 方法不起作用,特别是对于 tensorflow 变量对象(它似乎对 tensorflow.constant 对象很好)。

其他方法,如np.squarenp.sqrt等都可以用这个,但似乎只有np.dot特别不行。

编辑:我想知道为什么这些对象在传递给np.dot 函数时尤其不起作用。我意识到有多种方法可以找到两个 tf.Variable 对象之间的点积

【问题讨论】:

这能回答你的问题吗? Convert a tensor to numpy array in Tensorflow? @sehan2 我或多或少想知道为什么此代码返回错误。我意识到您可以将其转换为 np 数组,使用 TF 的内置方法等将这些相乘。 因为它们不是 numpy 数组。 numpy 库中几乎每个方法都需要一个 ndarray 对象才能工作。 @AndrewHolmgren 在这种情况下,为什么np.sqrt 之类的方法可以使用它?此外, np.dot 还可以与 tf.constant 对象一起使用。 tf.constant 只是一个 numpy 数组吗?如果是这样,为什么不是 tf.Variable? numpy 函数,当给定非 ndarray 参数时,要么将操作委托给这些参数(即它们需要相关方法),要么尝试将它们转换为数组。这就是 __array__() 方法试图做的事情(回溯是否说这是一个 tensorflow 方法?)。 【参考方案1】:

这似乎是 TensorFlow 中的一个错误。请参阅https://github.com/tensorflow/tensorflow/issues/46563。截至 2021 年 7 月 12 日,没有关于该 github 问题的解释,说明问题的原因。

【讨论】:

我明白了。所以如果我理解的话,这个错误是由于 Tensorflow 在 2.5 版本中的变化造成的? 错误行为在 2.3 版本中不存在,但在 2.4 和 2.5 中存在。

以上是关于为啥numpy点积函数在传递两个TensorFlow变量对象时会返回错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 scipy 的稀疏 csr_matrix 的向量点积比 numpy 的密集数组慢?

为什么两个numpy (n,)向量的矩阵@乘积是点积,而不是外积?

在 Cython 中调用点积和线性代数运算?

NumPy 点积:取向量积的积(而不是求和)

Python Numpy中的几个矩阵乘法

Numpy:点积和 dot() 矩阵相乘