【问题标题】:Broadcasting np.dot vs tf.matmul for tensor-matrix multiplication (Shape must be rank 2 but is rank 3 error)广播 np.dot 与 tf.matmul 进行张量矩阵乘法(形状必须为 2 级,但为 3 级错误)
【发布时间】:2018-06-06 17:57:43
【问题描述】:

假设我有以下张量:

X = np.zeros((3,201, 340))
Y = np.zeros((340, 28))

用 numpy 对 X、Y 进行点积是成功的,并产生一个形状为 (3, 201, 28) 的张量。 但是使用 tensorflow 我得到以下错误:Shape must be rank 2 but is rank 3 error ...

最小代码示例:

X = np.zeros((3,201, 340))
Y = np.zeros((340, 28))
print(np.dot(X,Y).shape) # successful (3, 201, 28)
tf.matmul(X, Y) # errornous

知道如何使用 tensorflow 实现相同的结果吗?

【问题讨论】:

    标签: python numpy tensorflow matrix-multiplication tensor


    【解决方案1】:

    Tensorflow 不允许像 numpy 那样将具有不同等级的矩阵相乘。

    为了解决这个问题,您可以重塑矩阵。这本质上是一个矩阵, 比如说,通过将矩阵“堆叠”一个在另一个之上,将排名 3 与排名 2 排名第一。

    你可以使用这个: tf.reshape(tf.matmul(tf.reshape(Aijk,[i*j,k]),Bkl),[i,j,l])

    其中 i、j 和 k 是矩阵 1 的维数,k 和 l 是矩阵 2 的维数。

    取自here

    【讨论】:

      【解决方案2】:

      由于您正在使用tensors,因此使用tensordot 会比np.dot 更好(为了性能)。 NumPy 允许它(numpy.dot)通过降低性能在 tensors 上工作,而 tensorflow 似乎根本不允许它。

      因此,对于 NumPy,我们将使用 np.tensordot -

      np.tensordot(X, Y, axes=((2,),(0,)))
      

      对于tensorflow,应该是tf.tensordot -

      tf.tensordot(X, Y, axes=((2,),(0,)))
      

      Related post to understand tensordot.

      【讨论】:

      • 虽然您的答案可能有效(我没有测试过),但要创建单个元素的元组,您应该使用(element,)(element)element 相同,即它不创建元组。
      • @HameerAbbasi tensordot 期望两个元组的元组作为轴参数。这就是我们在这里提供的。
      • 这正是重点。 ((2),(0)) 等价于 (2, 0),因为内部括号用于分组而不是创建元组。要创建两个元组的元组,请执行 ((2,),(0,)).
      • @HameerAbbasi 啊,我想对于这种特殊的单轴缩减情况,它同样适用于标量元组。
      • OP here:实际上,为了让它工作,我不得不使用((2,),(0,))
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 2019-05-10
      相关资源
      最近更新 更多