Python tensorflow einsum vs.matmul vs.tensordot

Python tensorflow einsum vs.matmul vs.tensordot,python,tensorflow,numpy-einsum,Python,Tensorflow,Numpy Einsum,在tensorflow中,函数tf.einsum、tf.matmul和tf.tensordot都可以用于相同的任务。(我意识到tf.einsum和tf.tensordot有更一般的定义;我还意识到tf.matmul具有批处理功能。)在可以使用这三种功能中的任何一种的情况下,一种功能往往最快吗?还有其他推荐规则吗 例如,假设A是秩-2张量,b是秩-1张量,您希望计算乘积c_j=A_ij b_j。在三个选项中: c=tf.einsum('ij,j->i',A,b) c=tf.matmul(A,tf.

在tensorflow中,函数
tf.einsum
tf.matmul
tf.tensordot
都可以用于相同的任务。(我意识到
tf.einsum
tf.tensordot
有更一般的定义;我还意识到
tf.matmul
具有批处理功能。)在可以使用这三种功能中的任何一种的情况下,一种功能往往最快吗?还有其他推荐规则吗

例如,假设
A
是秩-2张量,
b
是秩-1张量,您希望计算乘积
c_j=A_ij b_j
。在三个选项中:

c=tf.einsum('ij,j->i',A,b)

c=tf.matmul(A,tf.expand_dims(b,1))

c=tf.tensordot(A,b,1)

一般来说,任何一个都比其他的更可取吗?

两者都是语法上的糖类,它们包装了对的一个或多个调用(尽管在某些特殊情况下,
tf.einsum()
可以简化为更简单的元素)


在极限情况下,我希望这三个函数在相同的计算中具有相同的性能。但是,对于较小的矩阵,直接使用
tf.matmul()
可能更有效,因为它将生成一个操作更少的更简单的TensorFlow图,因此每次操作调用的成本将更低。

在我的示例中,我必须在应用
tf.matmul
之前在
b
上使用
tf.expand_dims
。此外,使用
tf.matmul
返回秩2张量而不是秩1张量;使
c
成为秩1张量需要在矩阵乘法后调用
tf.squence
压缩
扩展
操作的时间开销有意义吗?它们纯粹是元数据操作,所以它们的固定开销非常小,应该由
tf.matmul()
本身来控制。你确定吗?从根本上说,einsum的可能操作集是matmul可能操作的巨大超集;它总是在一个轴上收缩。在numpy einsum,性能可能存在巨大差异