Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带有批处理和广播的tensorflow矩阵乘法_Python_Numpy_Tensorflow_Matrix Multiplication - Fatal编程技术网

Python 带有批处理和广播的tensorflow矩阵乘法

Python 带有批处理和广播的tensorflow矩阵乘法,python,numpy,tensorflow,matrix-multiplication,Python,Numpy,Tensorflow,Matrix Multiplication,在以下情况下,我可以使用tf.matmul(A,B)执行批处理矩阵乘法: A.shape==(…,A,b)和 B.shape==(…,B,c) 其中,…是相同的 但我想要一个额外的广播: A.shape==(A,b,2,d)和 B.shape==(a,1,d,c) result.shape==(a、b、2、c) 我希望结果是a x b在(2,d)和(d,c)之间的矩阵乘法批 如何做到这一点 测试代码: import tensorflow as tf import numpy as np

在以下情况下,我可以使用
tf.matmul(A,B)
执行批处理矩阵乘法:

  • A.shape==(…,A,b)
  • B.shape==(…,B,c)
其中,
是相同的

但我想要一个额外的广播:

  • A.shape==(A,b,2,d)
  • B.shape==(a,1,d,c)

  • result.shape==(a、b、2、c)

我希望结果是
a x b
(2,d)
(d,c)
之间的矩阵乘法批

如何做到这一点


测试代码:

import tensorflow as tf
import numpy as np

a = 3
b = 4
c = 5
d = 6

x_shape = (a, b, 2, d)
y_shape = (a, d, c)
z_shape = (a, b, 2, c)

x = np.random.uniform(0, 1, x_shape)
y = np.random.uniform(0, 1, y_shape)
z = np.empty(z_shape)

with tf.Session() as sess:
    for i in range(b):
        x_now = x[:, i, :, :]
        z[:, i, :, :] = sess.run(
            tf.matmul(x_now, y)
        )

print(z)

tf.einsum
——任意维张量之间的广义收缩,在这样的问题上是你的朋友。见tf文档

关于stackoverflow有一个很好的教程:()


导入tensorflow作为tf
将numpy作为np导入
a=3
b=4
c=5
d=6
x_形状=(a,b,2,d)
y_形=(a,d,c)
z_形=(a,b,2,c)
x=tf.常数(np.随机均匀(0,1,x_形))
y=tf常数(np随机均匀(0,1,y_形))
z=tf.常数(np.空(z_形))
v=tf.einsum('abzd,adc->abzc',x,y)
打印z形、v形
使用tf.Session()作为sess:
打印sess.run(v)
结果:
(3, 4, 2, 5) (3, 4, 2, 5)
[[[[ 1.8353901   1.29175219  1.49873967  1.78156638  0.79548786]
[ 2.32836196  2.01395003  1.53038244  2.51846521  1.65700572]]
[[ 1.76139921  1.78029925  1.22302866  2.18659201  1.51694413]
[ 2.32021949  1.98895703  1.7098903   2.21515966  1.33412172]]
[[ 2.13246675  1.63539287  1.64610271  2.16745158  1.02269943]
[ 1.75559616  1.6715972   1.26049591  2.14399714  1.34957603]]
[[ 1.80167636  1.91194534  1.3438773   1.9659323   1.25718317]
[ 1.4379158   1.31033243  0.71024123  1.62527415  1.31030634]]]
[[[ 2.04902039  1.59019464  1.32415689  1.59438659  2.02918951]
[ 2.23684642  1.27256603  1.63474052  1.73646679  2.42958829]]
....
....

只需
tf.重塑
tf.matmul
。无需转置

import tensorflow as tf
import numpy as np

jit_scope = tf.contrib.compiler.jit.experimental_jit_scope

a = 3
b = 4
c = 5
d = 6

x_shape = (a, b, 2, d)
y_shape = (a, d, c)

x = tf.constant(np.random.uniform(0, 1, x_shape))
y = tf.constant(np.random.uniform(0, 1, y_shape))

x2 = tf.reshape(x, (a, b * 2, d))

with jit_scope():
    z = tf.reshape(tf.matmul(x2, y), (a, b, 2, c))
    z2 = x @ (y[:, np.newaxis, :, :])
    z3 = tf.einsum('abzd, adc -> abzc', x, y)

with tf.Session() as sess:
    z_, z2_, z3_ = sess.run([z, z2, z3])

assert np.allclose(z_, z2_)
assert np.allclose(z_, z3_)

B
y
有不同的形状?我不知道
tf
,但是
numpy
A@B
works.yup.对于
numpy
x@y[:,np.newaxis,:,:]
有效。这也适用于tensorflow。我不知道在gpu上tensorflow的
@
效率有多高。谢谢你的回答。如果我在gpu上运行tensorflow的
einsum
的实现速度和内存效率有多高?tensorflow的
@
如何?我记得numpy可以为
点使用并行mkl例程和
tensordot
但不适用于
einsum
。对于GPU不确定。对于CPU,它们可能是相同的。同样对于TPU,根据我个人经验,einsum更快(5%-10%)。tf中einsum的速度取决于
opt\u einsum
包的优化。@operator使用另一个代码路径: