1-05 ハードウェア化を見据えたモデルの作成

●モデルの定義の部分を修正

 CNNのモデルは図1‐11の上のサイト、GTSRB - CNN (98% Test Accuracy)のPythonコードを参考に作成します。ただし、将来的な
ハードウエア化(推論のみ)のためには若干変更が必要になります。

 図1‐51にPythonコードのモデル定義の部分を示します。赤線の部分、Conv2Dは畳み込み層、Denseは全結合層です。

図1-51 CNNの形状を決める部分

●各層とその出力数

 Conv2D関数の最初の引数は「出力のチャネル数」で層が進むにつれて16→32→64→128と増えていきます。
 Dense関数の最初の引数は「出力の要素数」で128→43と減っていきます。

そのままだとFPGAに入りきらない

 大きな変更点は一つ目のDenseで、従来
512だったものが128になっています。ここで述べたように、この層(5層目)は係数が 2048x128=262,144個 と多くなります。したがって従来の512のままだと 2048x512=1,048,576個 と4倍に膨らんでしまいます(*1)。

(*1)仮に係数1個が2ビットだとしても2MbitのROMが必要になり、FPGAに入り切らない可能性が高くなる。このFPGAに内蔵のメモリは約4Mbit


●5層目の出力の要素数を減らして回路を減らす

 そこで一つ目のDenseを512→256と減らしてPythonを走らせてみます。すると認識率がほとんど劣化しませんでした。更に128に減らしてもそれほど劣化せず、64にするとさすがに認識率が落ちました。このようにPythonの時点で試行錯誤しながらモデル定義していきます。

●学習のみに使用する関数の扱い

 またBatchNormalizationがコメントアウトされています。いわゆる偏差値を求めるような作業のようですが、特に認識率に影響はないようなのでコメントアウトしました(*2)

(*2)学習が安定する、学習の速度が速くなるなどの効果があるようです。

 Dropout関数はいわゆる「過学習」を防ぐためのようです。学習のときのみ働くもので、この関数はそのまま残してあります(*3)。

(*3)ハードウエア化するのは推論のみ。その際、Dropout関数はスルーされる。

●プーリングはMaxPool2D関数

 2、4層目の後にMaxPool2D関数があります。これはプーリングを行うものです。近傍の4画素から最大のものを残して画素数を1/4にします。



ReLUは引数で指定

 また1〜5層目の関数には'relu'という引数があります。これは図1‐52のようなReLU関数で、負の値は0とし、正の値はそのまま出力する関数です。各層の最後にこの関数が入ります。

図1-52 ReLU関数。各層の最後にある

●畳み込みと全結合を繋ぐFlatten関数

 4層目(畳み込みの最後)と5層目(全結合の最初)の間にFlatten関数があります。2次元を1次元に並び替える(ここ参照)関数です。

次のページへ

目次へ戻る