FC2カウンター FPGAの部屋 BinaryBrain Version 3 を試してみよう4
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

BinaryBrain Version 3 を試してみよう4

BinaryBrain Version 3 を試してみよう3”の続き。

再度、ryuz/BinaryBrain のBinaryBrain Version 3 がバージョンアップされたので、やり直ししてみよう。

手順も多少変更があるようだ。
まずはBinaryBrain を一旦削除した。
cd ~/Docker/BinaryBrain/
rm -rf BinaryBrain


もう一度BinaryBrain をインストールする。
git clone --recursive -b ver3_release https://github.com/ryuz/BinaryBrain.git
cd BinaryBrain/sample/mnist
make all
make dl_mnist
./sample-mnist All

BinaryBrain_21_190323.png

ログを示す。

masaaki@masaaki-H110M4-M01:~/Docker/BinaryBrain/BinaryBrain/sample/mnist$ ./sample-mnist All
binary mode
----------------------------------------------------------------------
[Sequential] 
  --------------------------------------------------------------------
  [RealToBinary] 
   input  shape : {28, 28, 1}   output shape : {28, 28, 1}
  --------------------------------------------------------------------
  [MicroMlp] 
    ------------------------------------------------------------------
    [MicroMlpAffine] 
     input  shape : {28, 28, 1}     output shape : {1024}
    ------------------------------------------------------------------
    [BatchNormalization] 
     input  shape : {1024}     output shape : {1024}
    ------------------------------------------------------------------
    [ReLU] 
     input  shape : {1024}     output shape : {1024}
  --------------------------------------------------------------------
  [MicroMlp] 
    ------------------------------------------------------------------
    [MicroMlpAffine] 
     input  shape : {1024}     output shape : {480}
    ------------------------------------------------------------------
    [BatchNormalization] 
     input  shape : {480}     output shape : {480}
    ------------------------------------------------------------------
    [ReLU] 
     input  shape : {480}     output shape : {480}
  --------------------------------------------------------------------
  [MicroMlp] 
    ------------------------------------------------------------------
    [MicroMlpAffine] 
     input  shape : {480}     output shape : {80}
    ------------------------------------------------------------------
    [BatchNormalization] 
     input  shape : {80}     output shape : {80}
    ------------------------------------------------------------------
    [ReLU] 
     input  shape : {80}     output shape : {80}
  --------------------------------------------------------------------
  [BinaryToReal] 
   input  shape : {80}   output shape : {10}
----------------------------------------------------------------------
fitting start : MnistSimpleLutMlp
     17.75s epoch[  1] test_accuracy : 0.8025 train_accuracy : 0.8013          
     37.07s epoch[  2] test_accuracy : 0.8581 train_accuracy : 0.8490          
     56.73s epoch[  3] test_accuracy : 0.8395 train_accuracy : 0.8336          
     83.60s epoch[  4] test_accuracy : 0.8591 train_accuracy : 0.8549          
    105.18s epoch[  5] test_accuracy : 0.8502 train_accuracy : 0.8488          
    128.99s epoch[  6] test_accuracy : 0.8568 train_accuracy : 0.8498          
    155.94s epoch[  7] test_accuracy : 0.8700 train_accuracy : 0.8693          
    180.72s epoch[  8] test_accuracy : 0.8595 train_accuracy : 0.8526          
fitting end

lut_accuracy : 0.8595                                                          
export : verilog/MnistSimpleLutMlp.v

binary mode
----------------------------------------------------------------------
[Sequential] 
  --------------------------------------------------------------------
  [RealToBinary] 
   input  shape : {28, 28, 1}   output shape : {28, 28, 1}
  --------------------------------------------------------------------
  [LoweringConvolution] 
   input  shape : {28, 28, 1}   output shape : {26, 26, 32}
  --------------------------------------------------------------------
  [LoweringConvolution] 
   input  shape : {26, 26, 32}   output shape : {24, 24, 32}
  --------------------------------------------------------------------
  [MaxPooling] 
   input  shape : {24, 24, 32}   output shape : {12, 12, 32}
  --------------------------------------------------------------------
  [LoweringConvolution] 
   input  shape : {12, 12, 32}   output shape : {10, 10, 32}
  --------------------------------------------------------------------
  [LoweringConvolution] 
   input  shape : {10, 10, 32}   output shape : {8, 8, 32}
  --------------------------------------------------------------------
  [MaxPooling] 
   input  shape : {8, 8, 32}   output shape : {4, 4, 32}
  --------------------------------------------------------------------
  [MicroMlp] 
   input  shape : {4, 4, 32}   output shape : {480}
  --------------------------------------------------------------------
  [MicroMlp] 
   input  shape : {480}   output shape : {80}
  --------------------------------------------------------------------
  [BinaryToReal] 
   input  shape : {80}   output shape : {10}
----------------------------------------------------------------------
fitting start : MnistSimpleLutCnn
    101.68s epoch[  1] test_accuracy : 0.7680 train_accuracy : 0.7581          
    248.48s epoch[  2] test_accuracy : 0.8577 train_accuracy : 0.8424          
    437.53s epoch[  3] test_accuracy : 0.8624 train_accuracy : 0.8540          
    610.11s epoch[  4] test_accuracy : 0.9123 train_accuracy : 0.9042          
    825.40s epoch[  5] test_accuracy : 0.9187 train_accuracy : 0.9075          
    967.89s epoch[  6] test_accuracy : 0.9176 train_accuracy : 0.9052          
   1108.22s epoch[  7] test_accuracy : 0.9179 train_accuracy : 0.9111          
   1259.69s epoch[  8] test_accuracy : 0.9258 train_accuracy : 0.9240          
fitting end

export : verilog/MnistSimpleLutCnn.v

fitting start : MnistDenseAffine
[initial] test_accuracy : 0.1566 train_accuracy : 0.1472                       
     69.02s epoch[  1] test_accuracy : 0.8887 train_accuracy : 0.8892          
    145.43s epoch[  2] test_accuracy : 0.9135 train_accuracy : 0.9251          
    220.56s epoch[  3] test_accuracy : 0.9259 train_accuracy : 0.9395          
    294.60s epoch[  4] test_accuracy : 0.9351 train_accuracy : 0.9562          
    367.37s epoch[  5] test_accuracy : 0.9363 train_accuracy : 0.9615          
    445.29s epoch[  6] test_accuracy : 0.9430 train_accuracy : 0.9699          
    523.36s epoch[  7] test_accuracy : 0.9448 train_accuracy : 0.9727          
    594.80s epoch[  8] test_accuracy : 0.9485 train_accuracy : 0.9789          
fitting end

accuracy : 0.162803
accuracy : 0.185766
accuracy : 0.187984
accuracy : 0.18695
accuracy : 0.184648
accuracy : 0.185732
accuracy : 0.190301
accuracy : 0.189684


BinaryBrain/sample/mnist/verilog ディレクトリのファイルを示す。
BinaryBrain_22_190323.png

その中から、tb_mnist_lut_mlp.v, MnistSimpleLutMlp.v, bb_lut.v を取り出して、Vivado 2018.3 のbinarybrain プロジェクトを作成した。
BinaryBrain_26_190323.png

ここで論理シミュレーションを行った。
BinaryBrain_23_190323.png

全体のシミュレーション波形を示す。
BinaryBrain_24_190323.png

終わりを拡大してみよう。
BinaryBrain_25_190323.png

out_of_counter がmatch した数を示しているそうだ。out_data_counter が全部の数を示している。従って精度は、8595/10000 x 100 = 85.95 % ということになる。
これは、学習した際の test_accuracy : 0.8595 に等しい。

次に試しに論理合成してみよう。
やはり、Utilization のIO が 1062 % で大幅に超えている。
BinaryBrain_27_190323.png

回路図を表示してみると、LUT の後にレジスタが並んでいるが分かる。
BinaryBrain_28_190323.png
  1. 2019年03月24日 05:24 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/4480-9103c983
この記事にトラックバックする(FC2ブログユーザー)