我有两个张量,a
等级4和b
等级1.我想生成aprime
,等级3,"签约& #34;通过用b
的点积替换它的最后一个轴。在numpy中,这就像np.tensordot(a, b, 1)
一样简单。但是,我无法在Tensorflow中找到一种方法。
如何将张量的最后一个轴替换为等于该轴的点积与另一个张量(当然,形状相同)的值?
更新:
我在维基百科中看到,这被称为" Tensor Inner Product" https://en.wikipedia.org/wiki/Dot_product#Tensors又称张量收缩。这似乎是一种常见的操作,我很惊讶在Tensorflow中没有明确支持它。
我相信这可能是tf.einsum
;但是,我无法找到适用于任何级别的张量的广义方法(这可能是因为我不理解einsum
并且已经减少为试验和错误)
答案 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)