ネットワークの入出力レイアウト - DigitalMediaProfessionals/dv-sdk GitHub Wiki

ネットワーク変換ツール(以降、変換ツールとします)でtranspose_weight フラグを無効(0)にすると、AI FPGAモジュールへの入出力データを転置する必要があります。現状、転置はCPUで行なわれています。フラグを有効(1)にすると、入出力データの転置は不要になり、代わりにネットワーク変換時に重み行列を転置します。転置する理由としては、FPGA内部にあるバッファに横幅のサイズ制限があるため転置することで制限を回避するためです。今後、横幅のサイズ制限は緩和する予定です。

制限を超えている場合には以下のメッセージが表示されます。

msg = ("The input width {1:d} of layer {0:s} exceeds maximum supported by FPGA {2:d}").format(
       node.name, node.input_dim[0], limit.max_conv_width)

ネットワークの入出力レイアウト

変換されたネットワークの入力形式はFP16 のDWHC 形式です。ただしtranspose_weight フラグを無効にしてネットワークを変換した際には、FP16 のDHWC 形式になります。

変換されたネットワークの出力形式はfloat のDWHC 形式です。

畳み込みブロックの入出力レイアウト

DV 畳み込みブロックは入出力バッファに下記のレイアウトを使います。

  • 入力画像のチャネル数が8 以下ならば
    • 各ピクセルが16 ビット浮動小数点数を使ったDWHC 形式(transpose_weight フラグが設定されていた場合はDHWC 形式)の画像データを使います。D は深度、W は幅、H は高さ、C はチャネル数を表します。
      • transpose_weight フラグが設定されていない場合、例えば (d, w, h, c) のピクセルデータは、画像の初めから(d * (W * H * C) + w * (H * C) + h * C + c) * 2 バイトのオフセットの位置に存在します。
      • transpose_weight フラグが設定されている場合、例えば (d, w, h, c) のピクセルデータは、画像の初めから(d * (W * H * C) + h * (W * C) + w * C + c) * 2` バイトのオフセットの位置に存在します。
  • 入力画像のチャネル数が8 より大きいならば
    • 入力画像は、複数の最大で8 チャネルのデータを含むチャンクに分割されます。各チャンクの画像形式はDWHC(transpose_weight フラグが設定されていた場合はDHWC)です。
      • 例えばチャネル数20 の画像は3 つのチャンクに分けられます。第一チャンクは0 から7 チャネルまでのデータを含みます。第二チャンクは8 から15 のチャネルのデータを含み、第三チャンクは残りのデータを含みます。
      • (x, y, n) にあるピクセルデータへのオフセットは次のように計算されます。
        chunk_id = n / 8
        n_ = n % 8
        C_ = 8     , if (n / 8 < C / 8)
           = C % 8 , if (n / 8 == C / 8)
        if not transpose_weight:
            offset = (chunk_id * (W * H * 8) + x * (H * C_) + y * C_ + n_) * 2
        else:
            offset = (chunk_id * (W * H * 8) + y * (W * C_) + x * C_ + n_) * 2

これまで入出力バッファを画像データとして説明していましたが、複数のチャネルをもつ1D, 2D, 3D の配列で表現できる任意のデータが入出力バッファに使用できます。

全結合ブロックの入出力レイアウト

全結合ブロックは入出力バッファを一次元の配列として扱うため、特別な処理は必要ありません。

畳み込みブロックの出力バッファを全結合ブロックの入力バッファをして扱うとき、その幅や高さが1 より大きいならば、ネットワーク変換ツールは重みを再整列します。

⚠️ **GitHub.com Fallback** ⚠️