10 / 24 · 概念
im2colと行列乗算
H=W=4,C=1、有効な3×3カーネルで、元入力要素数、P,K、展開パッチ要素数を計算してください。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
演算を別の形で表す
im2colは各入力ウィンドウを行列乗算用のベクトルへ平坦化します。ここでは各行に1パッチを置きます。行列AはP×K要素で、P=HoWo、K=CRSです。平坦化した重みは形状K×Mの行列Bの列です。積ABはP×Mです。パッチを列に置く規約もあるので、名前から推測せず軸を確定します。
全パッチ行列を実体化しても、必要時に生成しても構いません。同じ数値を生成できても記憶量と帯域幅が違います。行列乗算エンジンがあっても、完全な展開行列を外部メモリに書く必要はありません。
行列の計算例
[1,2,3;4,5,6;7,8,9]の2×2ウィンドウでは、Aの行は[1,2,4,5]、[2,3,5,6]、[4,5,7,8]、[5,6,8,9]です。カーネル[1,2;3,4]は重み列[1,2,3,4]です。4内積は37,47,67,77です。4×4と4×1の積が4×1となり、2×2出力へ戻せます。
元入力は9要素、展開行列は16要素です。中央の5は4回、角の1は1回現れます。実体化した表現では空間再利用が重複になります。1つの重みベクトルは全4パッチで再利用します。記憶領域を割り当てる前にP×Kを計算し、C×H×Wと比較します。出力領域が大きいと重複も大きくなり得ます。
複数チャネルではパッチと重みを同じc,r,s順に平坦化します。2チャネルの1×1パッチは[x0,x1]で、重みのチャネルだけ反転すると結果が変わります。非対称なチャネル値から始めます。グループ畳み込みは、全入力チャネルを無差別に含めず、グループごとにベクトルを作ります。
直接モデルとの一致が検証するのは算術値であり、物理メモリ転送やPEの同時動作ではありません。次章では同等のウィンドウをストリームから生成し、後のタイリングでは展開テンソル全体の保存を避けます。出力値とともに中間行列サイズと重複を記録し、割り当てのコストを見えるようにします。
自分で考えてみましょう
H=W=4,C=1、有効な3×3カーネルで、元入力要素数、P,K、展開パッチ要素数を計算してください。
解説を見る
入力は16要素です。出力は2×2なのでP=4、K=9です。完全なパッチ行列は36要素ですが、必要時にウィンドウ生成すれば全36の保存を避けられます。