tensorflow中的外积

co9*_*guy 17 tensorflow

在tensorflow中,有很好的入门和矩阵乘法函数,但是在查看文档之后,我找不到任何内部函数来获取两个张量的外积,即通过所有可能的较小张量元素的乘积产生更大的张量(比如numpy.outer):

v_{i,j} = x_i*h_j
Run Code Online (Sandbox Code Playgroud)

要么

M_{ij,kl} = A_{ij}*B_{kl}
Run Code Online (Sandbox Code Playgroud)

tensorflow有这样的功能吗?

dga*_*dga 20

是的,您可以通过利用tensorflow的广播语义来实现这一点.将第一个输出调整为自身的大小1xN,将第二个调整为自身的大小Mx1,并且当您将它们相乘时,您将获得所有结果的MxN广播.

(您可以在numpy中使用相同的东西来查看它在更简单的上下文中的行为,顺便说一句:

a = np.array([1, 2, 3, 4, 5]).reshape([5,1])
b = np.array([6, 7, 8, 9, 10]).reshape([1,5])
a*b
Run Code Online (Sandbox Code Playgroud)

在tensorflow中你究竟是如何做到这一点取决于你想要使用哪些轴以及你想要的结果乘法的语义,但一般的想法适用.

  • 还有`a[...,None]*b[None,...]` (2认同)
  • 对于 Tensorflow 2,它看起来像 `a = tf.expand_dims(a, axis=-1)` `b = tf.expand_dims(b, axis=-1)` `outer = tf.matmul(a, b) , transpose_b=True)` (2认同)

cgo*_*lin 7

令人惊讶的是,直到最近,还没有一种简单而自然的方式在张量流中的任意张量(也称为“张量积”)之间做外积,特别是考虑到库的名称...

随着tensorflow>=1.6你现在能做终于得到你想要一个简单的东西:

M = tf.tensordot(A, B, axes=0)
Run Code Online (Sandbox Code Playgroud)

在tensorflow的早期版本中,axes=0引发一个ValueError: 'axes' must be at least 1.tf.tensordot()过去至少需要某种方式来实际求和。最简单的方法是使用添加一个“假”尺寸tf.expand_dims()

tensorflow<=1.5你这样能得到相同的结果上面做:

M = tf.tensordot(tf.expand_dims(A, 0), tf.expand_dims(B, 0), axes=[[0],[0]])
Run Code Online (Sandbox Code Playgroud)

这将在两个张量的位置0处添加维1的新索引,然后tf.tensordot()对这些索引求和。


小智 5

在在这种情况下,别人绊倒,根据tensorflow文档,你可以使用tf.einsum()函数来计算两个张量的外积ab

# Outer product
>>> einsum('i,j->ij', u, v)  # output[i,j] = u[i]*v[j]
Run Code Online (Sandbox Code Playgroud)