Tensorflowでは、関数_tf.einsum
_、_tf.matmul
_、および_tf.tensordot
_をすべて同じタスクに使用できます。 (_tf.einsum
_と_tf.tensordot
_にはより一般的な定義があることを理解しています。また、_tf.matmul
_にはバッチ機能があることを理解しています。)最速に?他の推奨ルールはありますか?
たとえば、A
がランク2のテンソルであり、b
がランク1のテンソルであり、積_c_j = A_ij b_j
_を計算するとします。 3つのオプションのうち:
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()
の1回以上の呼び出しをラップする構文糖です=(ただし、一部の特殊なケースでは、tf.einsum()
はより単純な要素ごとに縮小できます tf.multiply()
)。
限界では、3つの関数すべてが同じ計算に対して同等のパフォーマンスを持つことを期待します。ただし、行列が小さい場合は、tf.matmul()
を直接使用する方が効率的です。これは、操作が少ないシンプルなTensorFlowグラフが生成され、操作ごとの呼び出しコストが低くなるためです。