.. DNN_LIB3 DNN.LIB3 ======== DNN.LIG3は、画像としてのデータフローブロックダイアグラム記述からVPPLソースを生成するのに使用できる現状唯一のライブラリです。 DNNを表すダイアグラムを描くときに使用する部品ライブラリが納められています。 BSH3Vエディタ上に配置し、相互の接続関係やパラメータを記すことができます。 各部品は、VPPL言語の言語要素や内蔵ライブラリ関数と対応しており、diagram2vpplツールにより対応するVPPLソースに変換されます。 以下にそれぞれの部品とパラメータについて説明します。 識別子の制限事項 ---------------- 英小文字 uとvで始まる識別子および、idx, idyとoptは diagram2vpplツールが使用するのでノード名に使ってはいけません。 また、英大文字 U, M, D, Bの後に数字が続く識別子はDNN.LIB3内の識別に使用されているのでこれもノード名に使ってはいけません。 なお、VPPLコンパイラの予約語、関数名等も識別子として使わない方が良いでしょう。 パラメータのデフォルト値 ------------------------ 部品の中にはパラメータを持つものがあります。 パラメータは パラメータ名=値; という形式で列挙されており、デフォルト値が定義されています。 デフォルト値と異なる値を指定したいときに、 パラメータ名=値; という形でアトリビュートのnote欄に記載するとそちらの値が使用されます。 部品番号 -------- 各部品には英大文字 U, M, D, Bの後に数字が続くユニークな部品番号を与える必要があります。 番号に重複があったり、番号が与えられないとエラーとなります。 また、ネットワークフローの上流から下流に向けて数字が大きくなるように番号を与えないとなりません。 Buffer ------ Bufferはデータ受け渡しのための基本構造です。 物理的なメモリ領域を表現します。 .. figure:: dnn204.png :scale: 50% :alt: Buffer Bufferの以下の端子にはコネクタを接続し、ノード名を与えておきます。 そうしておいて各部の接続時にそのノード名をラベルとして与えれば、物理メモリとの紐づけがなされます。 1. name Bufferは以下のパラメータを持ちます。 1. nSIZE 初期値は0. バッファとして確保する最大の物理メモリ量(バイト数)を与えます。 なお、Bufferに読み書きする場合は、確保した最大の物理メモリ量を超えなければそれより小さいサイズで構いません。 Param ----- Paramはコンボルーションレイヤなどで用いられる重み係数、バイアス値などのパラメータを与えるための構造です。 メモリ上に展開された定数配列を表現します。 .. figure:: dnn205.png :scale: 50% :alt: Param Paramの以下の端子にはコネクタを接続し、ノード名を与えておきます。 そうしておいて係数配列を必要とするレイヤにそのノードを接続すれば、配列と紐づけがなされたことになります。 1. name Paramは以下のパラメータを持ちます。 1. file$ 係数配列の値を保持しているFLT形式ファイルのファイル名を与えます 2. array$ ファイル内に複数存在する配列のどれを選択するか配列名を指定します 3. q$ 係数配列の内部表現形式を与えます。デフォルト値はQBITです。 4. nLIMIT 係数配列の大きさの最大値(バイト数)を与えます 5. nSTEP 1つの配列内に複数のチャネルに対する値を保持している場合などで、1チャネル当たりのバイト数を与えます Work ---- Workはレイヤ内の演算に使用する一時リソースです。 実体としてはレジスタバンクを表現します。 .. figure:: dnn206.png :scale: 50% :alt: Work Workの以下の端子にはコネクタを接続し、ノード名を与えておきます。 そうしておいてWork領域を必要とするレイヤにそのノードを接続すれば、リソースと紐づけがなされたことになります。 1. name Workにはパラメータがありません。 Dump ---- Dumpは途中のレイヤの出力などを確認したい場合に使用するデバッグ用の仮想的なリソースです。 VPPLコンパイラのスーパバイズの元に実行されているISIMシミュレーションにおける仮想出力コードが生成されます。 .. figure:: dnn207.png :scale: 50% :alt: Dump 出力したい位置のBufferノードと以下の端子を接続します。 1. name Dumpは以下のパラメータを持ちます。 1. mes$ 値のダンプに先立って出力される文字列を与えます。 2. iLimit 値をダンプする合計バイト数を指定します 3. iSTEP 1行に値をダンプするバイト数を指定します。 4. q$ ダンプする値の内部表現形式を与えます。デフォルト値はQBITです。 Prob ---- Probは最終の確率出力をISIMシミュレーション上で確認したい場合に使用する仮想的なリソースです。 VPPLコンパイラのスーパバイズの元に実行されているISIMシミュレーションにおける仮想出力コードが生成されます。 .. figure:: dnn208.png :scale: 50% :alt: Prob 確率を出力するSoftmax関数などの出力ノードについては通常のBufferノードではなく、特殊ノード uY 名を与えます。 Probの以下の端子に該当特殊ノードを接続します。 1. name Probにはパラメータがありません。 Pooling ------- Poolingはプーリングレイヤです。 プーリング処理1レイヤ分の実体コードが生成されます。 .. figure:: dnn209.png :scale: 50% :alt: Pooling 合計4つの端子があるので、それぞれ適切なノードと接続します。 1. IN 入力Bufferノードと接続します 2. OUT 出力Bufferノードと接続します 3. W 第1のWorkノードと接続します 4. Win 第2のWorkノードと接続します Poolingは以下のパラメータを持ちます。 1. iLimit 入力Bufferノードから実際に読み取る総バイト数を与えます 2. iSTEP 入力Bufferノードから複数のチャネルを含む場合に1回に読み取るバイト数を与えます 3. iSIZE 入力チャネルのサイズ(W=H)を与えます 4. oLimit 出力Bufferノードへ実際に書き込む総バイト数を与えます 5. oSTEP 出力Bufferノードへ複数のチャネルを書き込む場合に1回に書き込むバイト数を与えます 6. oSIZE 出力チャネルのサイズ(W=H)を与えます 7. nCH 処理するチャネル数を与えます 8. kSIZE カーネルサイズを与えます 9. kSTRIDE カーネルのストライド値を与えます VPPLの実体処理関数はWおよびHのサイズを独立に決められるような引数をとることができますが、現DNN.LB3ではWとHは同じ正方形のみに制限されます。 Fully Connected Layer(FCL) -------------------------- FCLは全結合レイヤです。 全結合1レイヤ分の実体コードが生成されます。 .. figure:: dnn210.png :scale: 50% :alt: FCL 合計7つの端子があるので、それぞれ適切なノードと接続します。 1. IN 入力Bufferノードと接続します 2. OUT 出力Bufferノードと接続します 3. W 第1のWorkノードと接続します 4. W1 第2のWorkノードと接続します 5. W2 第3のWorkノードと接続します 6. mA 係数配列パラメータと接続します 7. vB バイアスベクトルパラメータと接続します FCLは以下のパラメータを持ちます。 1. iUNIT 入力ユニット数を与えます 2. oUNIT 出力ユニット数を与えます 3. q$ 演算の内部表現形式を与えます。デフォルト値はQBIT_Fです。 Local Contrast Normalization Layer(LCN) --------------------------------------- LCNはローカルコントラスト正規化レイヤです。 実体コードが生成されます。 .. figure:: dnn211.png :scale: 50% :alt: LCN 合計6つの端子があるので、それぞれ適切なノードと接続します。 1. IN 入力Bufferノードと接続します 2. OUT 出力Bufferノードと接続します 3. W 第1のWorkノードと接続します 4. W1 第2のWorkノードと接続します 5. W2 第3のWorkノードと接続します 6. W3 第4のWorkノードと接続します LCNは以下のパラメータを持ちます。 1. iSIZE 入力チャネルのサイズ(W=H)を与えます 2. oSIZE 出力チャネルのサイズ(W=H)を与えます 3. kSIZE カーネルサイズを与えます。 4. nCH 処理チャンネル数を与えます。 5. q$ 演算の内部表現形式を与えます。デフォルト値はQBIT_Fです。 Convolution ----------- Convolutionはコンボルーションレイヤです。 実体コードが生成されます。 .. figure:: dnn212.png :scale: 50% :alt: Convolution 合計6つの端子があるので、それぞれ適切なノードと接続します。 1. IN 入力Bufferノードと接続します 2. OUT 出力Bufferノードと接続します 3. W 第1のWorkノードと接続します 4. Win 第2のWorkノードと接続します 5. Fp 係数配列パラメータと接続します 6. Bp バイアスベクトルパラメータと接続します Convolutionは以下のパラメータを持ちます。 1. iLimit 入力Bufferノードから実際に読み取る総バイト数を与えます 2. iSTEP 入力Bufferノードから複数のチャネルを含む場合に1回に読み取るバイト数を与えます 3. iCH 入力チャネル数を与えます 4. iSIZE 入力チャネルのサイズ(W=H)を与えます 5. oLimit 出力Bufferノードへ実際に書き込む総バイト数を与えます 6. oSTEP 出力Bufferノードへ複数のチャネルを書き込む場合に1回に書き込むバイト数を与えます 7. oCH 出力チャネル数を与えます 8. oSIZE 出力チャネルのサイズ(W=H)を与えます 9. kSIZE カーネルサイズを与えます。 10. kSTRIDE カーネルのストライド値を与えます 11. q$ 演算の内部表現形式を与えます。デフォルト値はQBITです。 RELU活性化関数 -------------- ReLUはRELU活性化関数です。 通常、コンボルーションレイヤなどの直後において出力を処理します。 実体コードが生成されます。 .. figure:: dnn213.png :scale: 50% :alt: ReLU 合計3つの端子があるので、それぞれ適切なノードと接続します。 ReLUの第1端子はI/O端子となっており、Convolutionレイヤ出力のBufferノードにぶるさげる形に配置します。 これにより、該当Bufferノードをインプレースで書き換えます。 1. IO 処理対象のBufferノードと接続します 2. W 第1のWorkノードと接続します 3. W1 第2のWorkノードと接続します ReLUは以下のパラメータを持ちます。 1. nUNIT 処理するユニット数を与えます。 2. q$ 演算の内部表現形式を与えます。デフォルト値はQBITです。 CVT32to16 --------- CVT32to16は内部演算形式の調整に用いる処理レイヤです。 パラメータ設定によっては、前後のレイヤの内部表現形式が異なる場合があり、そのような場合の調整に用います。 実体のある変換コードが生成されます。 .. figure:: dnn214.png :scale: 50% :alt: CVT32to16 合計4つの端子があるので、それぞれ適切なノードと接続します。 1. IN 入力Bufferノードと接続します 2. OUT 出力Bufferノードと接続します 3. W 第1のWorkノードと接続します 4. Win 第2のWorkノードと接続します CVT32to16は以下のパラメータを持ちます。 1. nUNIT 処理するユニット数を与えます。 2. q32$ 入力の32ビット形式の内部表現形式を与えます。デフォルト値はQBIT32です。 3. q$ 出力の16ビット形式の内部表現形式を与えます。デフォルト値はQBITです。 Softmax ------- SoftmaxはSoftmax活性化関数により出力となる確率を求める場合などで用いる処理レイヤです。 実体のコードが生成されます。 .. figure:: dnn215.png :scale: 50% :alt: Softmax 合計3つの端子があるので、それぞれ適切なノードと接続します。 なお、PROB仮想部品に接続する場合は、OUTノードは uY に接続せねばなりません。 1. IN 入力Bufferノードと接続します 2. OUT 出力Bufferノードと接続します 3. W 第1のWorkノードと接続します Softmaxは以下のパラメータを持ちます。 1. nUNIT 処理するユニット数を与えます。 2. q$ 入力の内部表現形式を与えます。デフォルト値はQBITです。 なお、Softmaxの出力の内部表現はF32Q16形式です。