問題タブ [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.

0 投票する
1 に答える
165 参照

matlab - テンソル乗算の最適化

私は最適化しようとしているリアルタイムの画像処理プログラムを持っていますが、それはすべて行列の乗算に要約されます。初期化段階で計算している 3 つのテンソルを考えてみましょう。

  1. A = np.arange(35 * 51 * 59).reshape([35, 51, 59])
  2. B = np.arange(37 * 51 * 51 * 59).reshape([37, 51, 51, 59])
  3. 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, DD = np.tensordot(M, T, axes=..)

また、プログラム自体はMATLABで書かれています。組み込みのテンソル乗算関数 (einsumまたはtensordot同等のもの) がないため、現在tprodツールボックスを使用して、次のことを行っています。

MATLAB の既定の内積関数 (2D 行列用) は よりもはるかに高速であるため、手書きのループを使用せずに、既定の関数を使用して複数の 2D 行列を作成できるように 2D 配列にetprod再形成することについて考えました。私もそれで成功しませんでした。A, B, C, Dfor

何かご意見は?ありがとう!

0 投票する
1 に答える
168 参照

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ところで、上記の結果が異常であることを納得させるために「通常」どのように動作するかを示す例を添付します。

出力: