TensorFlow:通过点积收缩两个张量的维数

时间:2016-10-05 05:37:14

标签: numpy tensorflow theano

我有两个张量,a等级4和b等级1.我想生成aprime,等级3,"签约& #34;通过用b的点积替换它的最后一个轴。在numpy中,这就像np.tensordot(a, b, 1)一样简单。但是,我无法在Tensorflow中找到一种方法。

如何将张量的最后一个轴替换为等于该轴的点积与另一个张量(当然,形状相同)的值?

更新

  1. 我在维基百科中看到,这被称为" Tensor Inner Product" https://en.wikipedia.org/wiki/Dot_product#Tensors又称张量收缩。这似乎是一种常见的操作,我很惊讶在Tensorflow中没有明确支持它。

  2. 我相信这可能是tf.einsum;但是,我无法找到适用于任何级别的张量的广义方法(这可能是因为我不理解einsum并且已经减少为试验和错误)

    < / LI>

3 个答案:

答案 0 :(得分:1)

你是不是只是在多维数组的意义上使用tensor?或者在某些学科中,张量是3d(向量1d,矩阵2d等)。我没有使用过tensorflow,但我认为它与线性代数传感器中的tensors没什么关系。他们谈论数据流图。我不确定这个名字的tensor部分来自哪里。

我假设你在谈论的表达方式如下:

In [293]: A=np.tensordot(np.ones((5,4,3,2)),np.arange(2),1)

产生(5,4,3)形状阵列。 einsum等价物是

In [294]: B=np.einsum('ijkl,l->ijk',np.ones((5,4,3,2)),np.arange(2))

np.einsum实现了Einstine Notation,如下所述:https://en.wikipedia.org/wiki/Einstein_notation。我从https://en.wikipedia.org/wiki/Tensor_contraction

获得了这个链接

您似乎在谈论直接的numpy操作,而不是tensorflow中的特殊操作。

答案 1 :(得分:0)

我首先将3个尺寸为1的尺寸添加到b,以便它可以沿着a的第4维广播。

b = tf.reshape(b, (1, 1, 1, -1))

然后你可以将b和a相乘,它将沿着所有其他维度广播b。

a_prime = a * b

最后,减少沿第4维的总和去除那个维度并用点积替换它。

a_prime = tf.reduce_sum(a_prime, [3])

答案 2 :(得分:0)

这似乎可行(对于任何等级的第一张量):

   tf.einsum('...i,i->...', x, y)