0
例えば、私はテンソルA(2,3,4)とテンソルB(3,4)を持ち、Bの次元0(バッチ次元)に沿ってAのKoefs乗算(縮約演算ではない)をBにする必要があります。 forループなしでこれを行う?バッチ次元に沿って2つの固有テンソルを複数にする方法は?
例えば、私はテンソルA(2,3,4)とテンソルB(3,4)を持ち、Bの次元0(バッチ次元)に沿ってAのKoefs乗算(縮約演算ではない)をBにする必要があります。 forループなしでこれを行う?バッチ次元に沿って2つの固有テンソルを複数にする方法は?
私はあなたの質問を理解したら、最初にBを(1,3,4)に変更して、ブロードキャストを使用して軸0に沿って値を複製することができます。これは非常に効率的かどうかは分かりません。
auto A = Tensor<float, 3>(2, 3, 4);
A.setValues({
{
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
},{
{ 10,20,30,40 },
{ 50,60,70,80 },
{ 90,100,110,120 },
}
});
auto W = Tensor<float, 2>(3,4);
W.setValues({
{ 1,2,3,4 },
{ 5,6,7,8 },
{ 9,10,11,12 }
});
auto three_dims = Eigen::array<int, 3>({ 1,3,4 });
auto bcast = Eigen::array<int, 3>({ 2,1,1 });
auto X = W.reshape(three_dims).broadcast(bcast);
auto Y = A*X;
std::cout << Y << std::endl;
プリント:
1 25 81 4 36 100 9 49 121 16 64 144
10 250 810 40 360 1000 90 490 1210 160 640 1440