形状各行はデータポイントは、私はこれらNのペアワイズ内積を計算したいです(NXD)のX、すなわちの上三角、XX 'のデータポイント。もちろんマトリックス所与Tensorflow(パイソン)において、
私は、全体のX-X」を計算し、その上部の三角形をフェッチするが、これは、私は非対角要素二回を計算するだろうことができます。 Tensorflow(python)で効率的に計算するには、ペアごとに一度しか内積を計算しないでください。
形状各行はデータポイントは、私はこれらNのペアワイズ内積を計算したいです(NXD)のX、すなわちの上三角、XX 'のデータポイント。もちろんマトリックス所与Tensorflow(パイソン)において、
私は、全体のX-X」を計算し、その上部の三角形をフェッチするが、これは、私は非対角要素二回を計算するだろうことができます。 Tensorflow(python)で効率的に計算するには、ペアごとに一度しか内積を計算しないでください。
numpyのを使用すると、これを行うことができます:これは真の出力
import numpy as np
A = np.random.randn(5, 3)
inds = np.triu_indices(5) # upper triangle indices
# expensive way to do it
ipu1 = np.dot(A, A.T)[inds]
# possibly less expensive way to do it.
ipu2 = np.einsum('ij,ij->i', A[inds[0]], A[inds[1]])
print(np.allclose(ipu1, ipu2))
。 Tensorflowにはtriu_indices関数の組み込み関数はありませんが、必要に応じてnumpyコードを調べて書き込むのは難しくありません。それはeinsumを持っています。
OPはTFのソリューションを要求していましたがnumpyではありませんでした。 triu_indicesを実装すると、非対角要素に対して実行される二重計算を回避するという目的を打ち消します。なぜなら、まずXX '全体を計算する必要があるからです。 –
@greeness申し訳ありませんが、私はかなり理解していません。 Xは正方形ではありません。コードを教えてください。 – Sharpplus
私は間違っていたと思う。以前のコメントを削除しました。 Pythonでは、どのようにこれを行うことができないのか分かりません。私も答えを見たいと思います。私はカーネルのソースコードを見ていませんでしたが、 'tf.matmul'は入力引数' transpose_b'を受け入れているので、既にBLASライブラリの内部最適化を行っている可能性があります。つまり、計算の節約がすでに検討されている可能性が高いということです。 – greeness