为啥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.square
、np.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 的密集数组慢?