【问题标题】:N-D tensor matrix multiplication with tensorflowN-D张量矩阵乘法与张量流
【发布时间】:2018-11-19 12:31:38
【问题描述】:

考虑我有一组向量A,我想将A 中的每个向量与张量T 相乘,最终得到一个张量y,其中每个切片矩阵是矢量vAT

如果X 仅包含一个向量,则以下代码有效(感谢matmul function for vector with tensor multiplication in tensorflow 中的答案):

tf.reduce_sum(tf.expand_dims(v,2)*T,1)

但是如果X 由多个向量组成,那么乘法的代码会是怎样的呢?

例如,对于A(带有2 向量)和T,我有以下值:

A = tf.constant([1,2,3,4], shape=[2,2], dtype=tf.float32) #v1 =[1,2], v2=[3,4]
T = tf.constant([1,2,3,4,5,6,7,8], shape=[2,2,2], dtype=tf.float32)

我想通过将A 乘以T 得到以下输出:

[[[ 7. 10.]
  [19. 22.]]

 [[15. 22.]
  [43. 50.]]]

这个问题的一个应用,是线性回归中的批量梯度下降 y = AX +b,其中我有一组向量,但不是训练权重矩阵X,而是训练张量T,所以输出y 将是一个张量,其中张量中的每个矩阵都是输入向量与T 相乘的输出。

请注意,一般来说,当我们将维度为 1*n 的向量 v 与维度为 T 的张量 m*n*k 相乘时,我们期望得到维度为 m*k/m*1*k 的矩阵/张量。这意味着我们的张量有m 维度的矩阵切片n*kv 与每个矩阵相乘,得到的向量堆叠在一起。

【问题讨论】:

    标签: tensorflow matrix-multiplication tensor


    【解决方案1】:

    试试tf.tensordot:

    tf.tensordot(A, T, axes=[-1, -2])
    

    或者,

    tf.squeeze(tf.tensordot(A[:, None], T, axes=[2, 1]))
    

    eval'ing 这给了

    array([[[ 7., 10.],
            [19., 22.]],
    
           [[15., 22.],
            [43., 50.]]], dtype=float32)
    

    【讨论】:

    • 非常感谢,这么简单的解决方案。我无法将右轴放入tf.tensordot