問題タブ [numpy-einsum]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
matlab - テンソル乗算の最適化
私は最適化しようとしているリアルタイムの画像処理プログラムを持っていますが、それはすべて行列の乗算に要約されます。初期化段階で計算している 3 つのテンソルを考えてみましょう。
A = np.arange(35 * 51 * 59).reshape([35, 51, 59])
B = np.arange(37 * 51 * 51 * 59).reshape([37, 51, 51, 59])
C = np.arange(59 * 27).reshape([59, 27])
各フレームで、4 番目のテンソルの形式で新しいデータを取得しています。
M = np.arange(35 * 37 * 59).reshape([35, 37, 59])
.
現在、私は を計算D = np.einsum('xyf,xtf,ytpf,fr->tpr', M, A, B, C)
していますが、D
これは私の希望する結果であり、プログラムの主要なボトルネックです。それを最適化するために私が従おうとしている2つの方向があります。
まず、事前に計算できるT
関数である tensorを考えてみました。私は成功しませんでした。私はそれに多くの時間を費やしましたが、それはまったく可能ですか?A, B, C, D
D = np.tensordot(M, T, axes=..)
また、プログラム自体はMATLABで書かれています。組み込みのテンソル乗算関数 (einsum
またはtensordot
同等のもの) がないため、現在tprod
ツールボックスを使用して、次のことを行っています。
MATLAB の既定の内積関数 (2D 行列用) は よりもはるかに高速であるため、手書きのループを使用せずに、既定の関数を使用して複数の 2D 行列を作成できるように 2D 配列にetprod
再形成することについて考えました。私もそれで成功しませんでした。A, B, C, D
for
何かご意見は?ありがとう!
python - Numpy einsum_path は、より多くの FLOP と「スピードダウン」を報告します
トピックについてはnp.einsum
、次の場所ですでに多くの議論を読んでいます。
np.eimsum
が通常np.sum
の 、 、などよりも高速である理由をさらに理解するためにnp.product
(anaconda の最新の numpy バージョンであっても)、np.einsum_path
最適化プロセスで何が最適化されたかを確認するために使用しています。
そうこうしていると面白い現象を発見。次の最小限の例を考えてみましょう。
出力はすべて同じです。
最適化された FLOPが増加し (計算が増えることを意味しますか?)、理論上のスピードアップが 1 よりも小さくなります (遅いことを意味します)。しかし、実際に計算の時間を計ると:
「ネイティブ」タイミングを最適化されたタイミングで割った値に対応する 2 番目の列を見ると、それらはすべて 1 に近く、最適化によって速度が低下していないことを意味します。
私はnp.einsum_path
、それがより多くのFLOPを必要とし、より遅いと傷が言うのだろうかと思っていますか? タイミングは FLOP の数から直接計算されるので、これら 2 つのベンチマークは基本的に同じことを指していると思います。
np.einsum_path
ところで、上記の結果が異常であることを納得させるために「通常」どのように動作するかを示す例を添付します。
出力: