Tensorflow,如何将2D张量(矩阵)乘以1D向量中的对应元素

时间:2017-12-14 15:41:05

标签: python numpy tensorflow matrix-multiplication tensor

我有一个形状M的二维矩阵[batch x dim],我有一个形状V的向量[batch]。如何将矩阵中的每个列乘以V中的相应元素?那就是:

enter image description here

我知道一个低效的numpy实现看起来像这样:

import numpy as np
M = np.random.uniform(size=(4, 10))
V = np.random.randint(4)
def tst(M, V):
  rows = []
  for i in range(len(M)):
    col = []
    for j in range(len(M[i])):
      col.append(M[i][j] * V[i])
    rows.append(col)
  return np.array(rows)

在tensorflow中,给定两个张量,实现这个目标的最有效方法是什么?

import tensorflow as tf
sess = tf.InteractiveSession()
M = tf.constant(np.random.normal(size=(4,10)), dtype=tf.float32)
V = tf.constant([1,2,3,4], dtype=tf.float32)

2 个答案:

答案 0 :(得分:5)

在NumPy中,我们需要制作V 2D,然后让广播进行逐元素乘法(即Hadamard乘积)。我猜,tensorflow上应该是一样的。因此,为了在tensorflow上展开变暗,我们可以使用tf.newaxis(在较新版本上)或tf.expand_dims或重塑tf.reshape -

tf.multiply(M, V[:,tf.newaxis])
tf.multiply(M, tf.expand_dims(V,1))
tf.multiply(M, tf.reshape(V, (-1, 1)))

答案 1 :(得分:4)

除了@Divakar的回答之外,我还要注意MV的顺序并不重要。似乎tf.multiplybroadcasting during multiplication

示例:

In [55]: M.eval()
Out[55]: 
array([[1, 2, 3, 4],
       [2, 3, 4, 5],
       [3, 4, 5, 6]], dtype=int32)

In [56]: V.eval()
Out[56]: array([10, 20, 30], dtype=int32)

In [57]: tf.multiply(M, V[:,tf.newaxis]).eval()
Out[57]: 
array([[ 10,  20,  30,  40],
       [ 40,  60,  80, 100],
       [ 90, 120, 150, 180]], dtype=int32)

In [58]: tf.multiply(V[:, tf.newaxis], M).eval()
Out[58]: 
array([[ 10,  20,  30,  40],
       [ 40,  60,  80, 100],
       [ 90, 120, 150, 180]], dtype=int32)