私は最適化しようとしているリアルタイムの画像処理プログラムを持っていますが、それはすべて行列の乗算に要約されます。初期化段階で計算している 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
ツールボックスを使用して、次のことを行っています。
temp1 = etprod('dcb', A, 'abc', M, 'adc');
temp2 = etprod('dbc', B, 'abcd', temp1, 'adb');
D = etprod('cdb', C, 'ab', temp2, 'acd');
MATLAB の既定の内積関数 (2D 行列用) は よりもはるかに高速であるため、手書きのループを使用せずに、既定の関数を使用して複数の 2D 行列を作成できるように 2D 配列にetprod
再形成することについて考えました。私もそれで成功しませんでした。A, B, C, D
for
何かご意見は?ありがとう!