在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.tensordot()
和tf.einsum()
是语法糖那套一个或更多的调用tf.matmul()
(虽然在一些特殊情况下tf.einsum()
可以降低到简单的按元素tf.multiply()
)。
在极限情况下,我希望所有三个函数在同一计算中都具有相同的性能。但是,对于较小的矩阵,tf.matmul()
直接使用可能会更有效,因为它会产生带有较少操作的更简单的TensorFlow图,因此每操作调用的成本会更低。