12-01 ROM内の画像8枚がFPGAで正しく推論されていることを確認

 前章では「畳み込みニューラルネットワーク」がFPGAに収まるよう回路規模を削減しました。そのブロック図を図12-01に示します。画像ROMの中にはMNISTの最初の8枚の画像データが入っており、それらを繰り返し読み出して畳み込み1層目の入力とします。

 最後の判定回路の入力
AINにはAffin2層目の結果が入力されます。判定回路の出力ANSWERからは推論結果(0から9までの値、4ビット)となり、FPGAの外部に出力されます。


  図12-01 画像ROMからの8枚が繰り返し推論される

●FPGAをオシロであたって推論結果を見る

 FPGAはIntel社のCycloneVなので、
Quartus Primeというツールでプロジェクトを作成し、コンパイルの後、書き込みます(その手順はここ)。写真12-01のようにコネクタGPIO 1の右上の4ピンからANSWER信号が出てきます。



  写真12-01 Terasic社のDE1-SoCをこのようにセットアップして書き込む


●シミュレーション通りに動いている!

 ANSWER信号をオシロで確認したものが写真12-02です(プローブが2本しかないので合成写真)。推論結果は7,2,1,0,4,1,4,9と続きます。またその周期はシミュレーション通り
100usになっています(*1)。

(*1)クロック周期10ns×10kサイクルでピタリ100us、常にこの値になる。このように「推論にかかる時間が正確に見積もれる」ことがFPGAの強みである(パソコンやラズベリーパイではこうはならない)



  写真12-02 正しい推論結果が100us周期で出てくる


●Pythonと同じことがFPGA内部で起こっている

 図12-02は同じ推論を
Pythonで行った結果です。畳み込みニューラルネットワークでは複雑な演算を行いますが、所詮は整数の掛け算と足し算です。言語がPythonだろうがVHDLだろうが同じ結果になります。そしてVHDLをFPGAに正しくインプリすれば当然結果は一致し、正解率も同じ(98.53%)になるはずです。



  図12-02 Pythonの結果と確認(Anaconda Jupyter Labで動作)


●無償で使えるロジックアナライザSignalTapでFPGA内部を見る

 Quartus Primeには
SignalTapというロジックアナライザ(*2)機能があります。図12-03はAffine2層目の出力AINを観測したものです。7+1番目が一番大きいのでANSWERは’7’になります。図12-02の1行目とピタリ一致していることを確認しましょう。

(*2)FPGAの内部信号を観測できるツール。使い方はここ



  図12-03 MNISTの1枚目は数字の’7’

 図12-04はAINの2+1番目が一番大きいのでANSWERは’2’になります。図12-02の2行目とピタリ一致していることを確認しましょう。

  図12-04 MNISTの2枚目は数字の’2’

 図12-05はAINの1+1番目が一番大きいのでANSWERは’1’になります。図12-02の3行目とピタリ一致していることを確認しましょう。

  図12-05 MNISTの3枚目は数字の’1’

 図12-06はAINの0+1番目が一番大きいのでANSWERは’0’になります。図12-02の4行目とピタリ一致していることを確認しましょう。

  図12-06 MNISTの4枚目は数字の’0’

 図12-07はAINの4+1番目が一番大きいのでANSWERは’4’になります。図12-02の5行目とピタリ一致していることを確認しましょう。

  図12-07 MNISTの5枚目は数字の’4’

 図12-08はAINの1+1番目が一番大きいのでANSWERは’1’になります。図12-02の6行目とピタリ一致していることを確認しましょう。

  図12-08 MNISTの6枚目は数字の’1’

 図12-09はAINの4+1番目が一番大きいのでANSWERは’4’になります。図12-02の7行目とピタリ一致していることを確認しましょう。

  図12-09 MNISTの7枚目は数字の’4’

 図12-10はAINの9+1番目が一番大きいのでANSWERは’9’になります。図12-02の8行目とピタリ一致していることを確認しましょう。

  図12-10 MNISTの8枚目は数字の’9’


目次へ戻る