2-07 層間にリミッタを設けてレジスタやRAMの節約

●FPGA内部RAMを使う

 
各層間のデータの受け渡しは図2‐35のようにRAM(画像メモリ)を介して行われます。これらメモリに読み書きするデータが大きい(ビット幅が多い)とFPGA内部RAMが足りなくなる恐れがあります。

図2-35 RAMのデータ幅を小さくしたい

符号なし5ビットに収める

 したがって図2‐36のように各層の出力にリミッタを設けます。同図では1層目の出力が31を超えないように(5ビットで収まるように)しています(*1、2)。

*1)各層”ReLU”があるので出力は正の数のみ。リミッタで0〜31になる。
(*2)この理由で各層の出力を1/256するが、1層目は更に1/8にする。これも5ビットに収めるための対策。


図2‐36 Pythonコードの一部

●演算の途中経過を見てみる

 また同図ではその出力をCSVファイル(lay1out_00〜15.csv)にセーブしています。図2‐37はlay1out_00.csv(1層目の出力Ch0)で、このように最大31で飽和しています。

図2‐37 1層目の出力。31でリミッタがかかっている

●5層目の出力も31でリミッタ

 
リミッタは1層目から5層目の出力に施されます。図2‐38はlay5out.csv(5層目の出力)です。全結合層なので出力チャネルは一つ、要素数は128になります。最後のデータにリミッタがかかっているのが分かります。

図2‐38 5層目の出力

レジスタなど回路全体の削減に効いてくる

 リミッタを設けてビット数を制限することによりRAMはもちろん、各層内で使用するレジスタ(DF/F)も削減できます。


●2〜6層目のバイアスの値を1/8に

 また図2‐36のように1層目の出力は1/256の後、1/8されています。それにより2層目以降の入力のボリュームが1/8になるので、バイアスもそれに合わせて1/8にします(図2‐39)

図2‐39 2層目以降はバイアスを1/8にする


次のページへ


目次へ戻る