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次元に並び替える(ここ参照)関数です。 |
次のページへ
目次へ戻る
|