【问题标题】:How do I multiply a tensor by a matrix如何将张量乘以矩阵
【发布时间】:2018-02-23 20:19:57
【问题描述】:

所以我有数组A,形状为[32,60,60],数组B,形状为[32,60]。第一个维度是批大小,所以第一个维度是独立的。我想做的是一个简单的向量乘法矩阵。因此,对于A 中的每个样本,我想将[60,60] 形状的矩阵与[60] 形状的向量相乘。乘以批次 A*B 应该会给我一个形状数组 [32,60]

这应该很简单,但我做错了:

>>> v = np.matmul(A,B)
ValueError: shapes (32,60,60) and (32,60) not aligned: 60 (dim 2) != 32 (dim 0)

这是用于 tensorflow,但如果我可以转换符号,一个 numpy 答案可能就足够了。

【问题讨论】:

    标签: python numpy tensorflow


    【解决方案1】:

    您似乎正在尝试使用 matrix-multiplicationsum-reduce 来自两个输入数组的最后一个轴。因此,使用np.einsum,它将是 -

    np.einsum('ijk,ik->ij',A,B)
    

    对于tensorflow,我们可以使用tf.einsum


    对于np.matmul,我们需要将B 扩展到3D,方法是在最后一个轴处引入一个新轴。因此,使用np.matmul 将得到B's 扩展版本sum-reduced 的第二个轴,而不是A 的第三个轴。结果将是3D。因此,通过切片或np.squeeze 挤出最后一个单轴。因此,实现将是 -

    np.matmul(A,B[...,None])[...,0]
    

    我们已经有一个现有的tf.matmul 函数。

    【讨论】:

    • tf.einsum 就像一个魅力。我不知道einsum。谢谢!