Tensorflow 中的张量乘法
Tensor multiplication in Tensorflow
我正在尝试在 NumPy/Tensorflow 中执行张量乘法。
我有 3 个张量 - A (M X h), B (h X N X s), C (s X T)
。
我相信 A X B X C
应该产生一个张量 D (M X N X T)
。
这是代码(同时使用 numpy 和 tensorflow)。
M = 5
N = 2
T = 3
h = 2
s = 3
A_np = np.random.randn(M, h)
C_np = np.random.randn(s, T)
B_np = np.random.randn(h, N, s)
A_tf = tf.Variable(A_np)
C_tf = tf.Variable(C_np)
B_tf = tf.Variable(B_np)
# Tensorflow
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print sess.run(A_tf)
p = tf.matmul(A_tf, B_tf)
sess.run(p)
这 return 是以下错误:
ValueError: Shape must be rank 2 but is rank 3 for 'MatMul_2' (op: 'MatMul') with input shapes: [5,2], [2,2,3].
如果我们尝试仅使用 numpy 矩阵进行乘法运算,则会出现以下错误:
np.multiply(A_np, B_np)
ValueError: operands could not be broadcast together with shapes (5,2) (2,2,3)
但是,我们可以这样使用np.tensordot
:
np.tensordot(np.tensordot(A_np, B_np, axes=1), C_np, axes=1)
TensorFlow中有没有等价的操作?
回答
在numpy中,我们会这样做:
ABC_np = np.tensordot(np.tensordot(A_np, B_np, axes=1), C_np, axes=1)
在tensorflow中,我们会这样做:
AB_tf = tf.tensordot(A_tf, B_tf,axes = [[1], [0]])
AB_tf_C_tf = tf.tensordot(AB_tf, C_tf, axes=[[2], [0]])
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
ABC_tf = sess.run(AB_tf_C_tf)
np.allclose(ABC_np, ABC_tf)
return True
.
尝试
tf.tensordot(A_tf, B_tf,axes = [[1], [0]])
例如:
x=tf.tensordot(A_tf, B_tf,axes = [[1], [0]])
x.get_shape()
TensorShape([Dimension(5), Dimension(2), Dimension(3)])
这里是tensordot documentation, and here is the relevant github repository。
我正在尝试在 NumPy/Tensorflow 中执行张量乘法。
我有 3 个张量 - A (M X h), B (h X N X s), C (s X T)
。
我相信 A X B X C
应该产生一个张量 D (M X N X T)
。
这是代码(同时使用 numpy 和 tensorflow)。
M = 5
N = 2
T = 3
h = 2
s = 3
A_np = np.random.randn(M, h)
C_np = np.random.randn(s, T)
B_np = np.random.randn(h, N, s)
A_tf = tf.Variable(A_np)
C_tf = tf.Variable(C_np)
B_tf = tf.Variable(B_np)
# Tensorflow
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print sess.run(A_tf)
p = tf.matmul(A_tf, B_tf)
sess.run(p)
这 return 是以下错误:
ValueError: Shape must be rank 2 but is rank 3 for 'MatMul_2' (op: 'MatMul') with input shapes: [5,2], [2,2,3].
如果我们尝试仅使用 numpy 矩阵进行乘法运算,则会出现以下错误:
np.multiply(A_np, B_np)
ValueError: operands could not be broadcast together with shapes (5,2) (2,2,3)
但是,我们可以这样使用np.tensordot
:
np.tensordot(np.tensordot(A_np, B_np, axes=1), C_np, axes=1)
TensorFlow中有没有等价的操作?
回答
在numpy中,我们会这样做:
ABC_np = np.tensordot(np.tensordot(A_np, B_np, axes=1), C_np, axes=1)
在tensorflow中,我们会这样做:
AB_tf = tf.tensordot(A_tf, B_tf,axes = [[1], [0]])
AB_tf_C_tf = tf.tensordot(AB_tf, C_tf, axes=[[2], [0]])
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
ABC_tf = sess.run(AB_tf_C_tf)
np.allclose(ABC_np, ABC_tf)
return True
.
尝试
tf.tensordot(A_tf, B_tf,axes = [[1], [0]])
例如:
x=tf.tensordot(A_tf, B_tf,axes = [[1], [0]])
x.get_shape()
TensorShape([Dimension(5), Dimension(2), Dimension(3)])
这里是tensordot documentation, and here is the relevant github repository。