FC2カウンター FPGAの部屋 DNN
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

BinaryBrain Version 3 を試してみよう3

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

前回は、ryuz/BinaryBrain のBinaryBrain Version 3 をコンパイルして実行したが、バージョンが新しくなったということで、もう一度やってみよう。

まずは、~/Docker/BinaryBrain ディレクトリで、rm -rf BinaryBrain してディレクトリを消去した。
git clone でBinaryBrain を持ってきた。
git clone --recursive -b ver3_release https://github.com/ryuz/BinaryBrain.git
BinaryBrain_15_190322.png

BinaryBrain_16_190322.png

cd BinaryBrain/sample/mnist/
make WITH_CUDA=Yes all

BinaryBrain_17_190322.png

ログを示す。

masaaki@masaaki-H110M4-M01:~/Docker/BinaryBrain/BinaryBrain/sample/mnist$ make WITH_CUDA=Yes all
make -C ../../cuda
make[1]: ディレクトリ '/home/masaaki/Docker/BinaryBrain/BinaryBrain/cuda' に入ります
nvcc -c -I ../include Manager.cu -o Manager.o
nvcc -c -I ../include MicroMlp.cu -o MicroMlp.o
nvcc -c -I ../include Im2Col.cu -o Im2Col.o
nvcc -c -I ../include Col2Im.cu -o Col2Im.o
nvcc -c -I ../include MaxPooling.cu -o MaxPooling.o
nvcc -c -I ../include BatchNormalization.cu -o BatchNormalization.o
nvcc -c -I ../include ReLU.cu -o ReLU.o
nvcc -c -I ../include Binarize.cu -o Binarize.o
nvcc -c -I ../include Vector.cu -o Vector.o
nvcc -c -I ../include HorizontalSum.cu -o HorizontalSum.o
ar rcs libbbcu.a Manager.o MicroMlp.o Im2Col.o Col2Im.o MaxPooling.o BatchNormalization.o ReLU.o Binarize.o Vector.o HorizontalSum.o
make[1]: ディレクトリ '/home/masaaki/Docker/BinaryBrain/BinaryBrain/cuda' から出ます
nvcc -Xcompiler '-O2 -mavx2 -mfma -fopenmp -std=c++14' -I../../include -I../../eigen -I../../cereal/include -DBB_WITH_CEREAL -DBB_WITH_CUDA -c main.cpp
nvcc -Xcompiler '-O2 -mavx2 -mfma -fopenmp -std=c++14' -I../../include -I../../eigen -I../../cereal/include -DBB_WITH_CEREAL -DBB_WITH_CUDA -c MnistSimpleLutMlp.cpp
nvcc -Xcompiler '-O2 -mavx2 -mfma -fopenmp -std=c++14' -I../../include -I../../eigen -I../../cereal/include -DBB_WITH_CEREAL -DBB_WITH_CUDA -c MnistSimpleLutCnn.cpp
nvcc -Xcompiler '-O2 -mavx2 -mfma -fopenmp -std=c++14' -I../../include -I../../eigen -I../../cereal/include -DBB_WITH_CEREAL -DBB_WITH_CUDA -c MnistDenseAffine.cpp
nvcc -Xcompiler '-O2 -mavx2 -mfma -fopenmp -std=c++14' -I../../include -I../../eigen -I../../cereal/include -DBB_WITH_CEREAL -DBB_WITH_CUDA -c MnistSimpleMicroMlpScratch.cpp
nvcc -o sample-mnist -Xcompiler '-O2 -mavx2 -mfma -fopenmp -std=c++14' -I../../include -I../../eigen -I../../cereal/include -DBB_WITH_CEREAL -DBB_WITH_CUDA main.o MnistSimpleLutMlp.o MnistSimpleLutCnn.o MnistDenseAffine.o MnistSimpleMicroMlpScratch.o ../../cuda/libbbcu.a


make WITH_CUDA=Yes run
BinaryBrain_18_190322.png

ログを示す。

masaaki@masaaki-H110M4-M01:~/Docker/BinaryBrain/BinaryBrain/sample/mnist$ make WITH_CUDA=Yes run
wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
--2019-03-21 22:55:05--  http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
yann.lecun.com (yann.lecun.com) をDNSに問いあわせています... 216.165.22.6
yann.lecun.com (yann.lecun.com)|216.165.22.6|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 9912422 (9.5M) [application/x-gzip]
`train-images-idx3-ubyte.gz' に保存中

train-images-idx3-u 100%[===================>]   9.45M  2.83MB/s    時間 3.3s  

2019-03-21 22:55:09 (2.83 MB/s) - `train-images-idx3-ubyte.gz' へ保存完了 [9912422/9912422]

gzip -c -d train-images-idx3-ubyte.gz  > train-images-idx3-ubyte
wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
--2019-03-21 22:55:09--  http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
yann.lecun.com (yann.lecun.com) をDNSに問いあわせています... 216.165.22.6
yann.lecun.com (yann.lecun.com)|216.165.22.6|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 28881 (28K) [application/x-gzip]
`train-labels-idx1-ubyte.gz' に保存中

train-labels-idx1-u 100%[===================>]  28.20K   161KB/s    時間 0.2s  

2019-03-21 22:55:10 (161 KB/s) - `train-labels-idx1-ubyte.gz' へ保存完了 [28881/28881]

gzip -c -d train-labels-idx1-ubyte.gz  > train-labels-idx1-ubyte
wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz
--2019-03-21 22:55:10--  http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz
yann.lecun.com (yann.lecun.com) をDNSに問いあわせています... 216.165.22.6
yann.lecun.com (yann.lecun.com)|216.165.22.6|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1648877 (1.6M) [application/x-gzip]
`t10k-images-idx3-ubyte.gz' に保存中

t10k-images-idx3-ub 100%[===================>]   1.57M  1.19MB/s    時間 1.3s  

2019-03-21 22:55:11 (1.19 MB/s) - `t10k-images-idx3-ubyte.gz' へ保存完了 [1648877/1648877]

gzip -c -d t10k-images-idx3-ubyte.gz   > t10k-images-idx3-ubyte
wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz
--2019-03-21 22:55:12--  http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz
yann.lecun.com (yann.lecun.com) をDNSに問いあわせています... 216.165.22.6
yann.lecun.com (yann.lecun.com)|216.165.22.6|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 4542 (4.4K) [application/x-gzip]
`t10k-labels-idx1-ubyte.gz' に保存中

t10k-labels-idx1-ub 100%[===================>]   4.44K  --.-KB/s    時間 0s    

2019-03-21 22:55:12 (196 MB/s) - `t10k-labels-idx1-ubyte.gz' へ保存完了 [4542/4542]

gzip -c -d t10k-labels-idx1-ubyte.gz   > t10k-labels-idx1-ubyte
./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 : {360}
    ------------------------------------------------------------------
    [BatchNormalization] 
     input  shape : {360}     output shape : {360}
    ------------------------------------------------------------------
    [ReLU] 
     input  shape : {360}     output shape : {360}
  --------------------------------------------------------------------
  [MicroMlp] 
    ------------------------------------------------------------------
    [MicroMlpAffine] 
     input  shape : {360}     output shape : {60}
    ------------------------------------------------------------------
    [BatchNormalization] 
     input  shape : {60}     output shape : {60}
    ------------------------------------------------------------------
    [ReLU] 
     input  shape : {60}     output shape : {60}
  --------------------------------------------------------------------
  [MicroMlp] 
    ------------------------------------------------------------------
    [MicroMlpAffine] 
     input  shape : {60}     output shape : {10}
    ------------------------------------------------------------------
    [BatchNormalization] 
     input  shape : {10}     output shape : {10}
    ------------------------------------------------------------------
    [ReLU] 
     input  shape : {10}     output shape : {10}
  --------------------------------------------------------------------
  [BinaryToReal] 
   input  shape : {10}   output shape : {10}
----------------------------------------------------------------------
fitting start : MnistSimpleLutMlp
     13.36s epoch[  1] test_accuracy : 0.7730 train_accuracy : 0.7721          
     29.92s epoch[  2] test_accuracy : 0.8502 train_accuracy : 0.8425          
     46.17s epoch[  3] test_accuracy : 0.8627 train_accuracy : 0.8567          
     62.37s epoch[  4] test_accuracy : 0.8740 train_accuracy : 0.8649          
     78.69s epoch[  5] test_accuracy : 0.8574 train_accuracy : 0.8561          
     95.02s epoch[  6] test_accuracy : 0.8728 train_accuracy : 0.8687          
    111.27s epoch[  7] test_accuracy : 0.8762 train_accuracy : 0.8670          
    127.36s epoch[  8] test_accuracy : 0.8512 train_accuracy : 0.8435          
fitting end

lut_accuracy : 0.8512                                                          
export : verilog/MnistSimpleLutMlp.v

binary mode
----------------------------------------------------------------------
[Sequential] 
  --------------------------------------------------------------------
  [RealToBinary] 
   input  shape : {28, 28, 1}   output shape : {28, 28, 1}
  --------------------------------------------------------------------
  [LoweringConvolution] 
    ------------------------------------------------------------------
    [ConvolutionIm2Col] 
     input  shape : {28, 28, 1}     output shape : {3, 3, 1}
    ------------------------------------------------------------------
    [Sequential] 
      ----------------------------------------------------------------
      [MicroMlp] 
        --------------------------------------------------------------
        [MicroMlpAffine] 
         input  shape : {3, 3, 1}         output shape : {192}
        --------------------------------------------------------------
        [BatchNormalization] 
         input  shape : {192}         output shape : {192}
        --------------------------------------------------------------
        [ReLU] 
         input  shape : {192}         output shape : {192}
      ----------------------------------------------------------------
      [MicroMlp] 
        --------------------------------------------------------------
        [MicroMlpAffine] 
         input  shape : {192}         output shape : {32}
        --------------------------------------------------------------
        [BatchNormalization] 
         input  shape : {32}         output shape : {32}
        --------------------------------------------------------------
        [ReLU] 
         input  shape : {32}         output shape : {32}
    ------------------------------------------------------------------
    [ConvolutionCol2Im] 
     input  shape : {32}     output shape : {26, 26, 32}
  --------------------------------------------------------------------
  [LoweringConvolution] 
    ------------------------------------------------------------------
    [ConvolutionIm2Col] 
     input  shape : {26, 26, 32}     output shape : {3, 3, 32}
    ------------------------------------------------------------------
    [Sequential] 
      ----------------------------------------------------------------
      [MicroMlp] 
        --------------------------------------------------------------
        [MicroMlpAffine] 
         input  shape : {3, 3, 32}         output shape : {192}
        --------------------------------------------------------------
        [BatchNormalization] 
         input  shape : {192}         output shape : {192}
        --------------------------------------------------------------
        [ReLU] 
         input  shape : {192}         output shape : {192}
      ----------------------------------------------------------------
      [MicroMlp] 
        --------------------------------------------------------------
        [MicroMlpAffine] 
         input  shape : {192}         output shape : {32}
        --------------------------------------------------------------
        [BatchNormalization] 
         input  shape : {32}         output shape : {32}
        --------------------------------------------------------------
        [ReLU] 
         input  shape : {32}         output shape : {32}
    ------------------------------------------------------------------
    [ConvolutionCol2Im] 
     input  shape : {32}     output shape : {24, 24, 32}
  --------------------------------------------------------------------
  [MaxPooling] 
   input  shape : {24, 24, 32}   output shape : {12, 12, 32}
  --------------------------------------------------------------------
  [LoweringConvolution] 
    ------------------------------------------------------------------
    [ConvolutionIm2Col] 
     input  shape : {12, 12, 32}     output shape : {3, 3, 32}
    ------------------------------------------------------------------
    [Sequential] 
      ----------------------------------------------------------------
      [MicroMlp] 
        --------------------------------------------------------------
        [MicroMlpAffine] 
         input  shape : {3, 3, 32}         output shape : {192}
        --------------------------------------------------------------
        [BatchNormalization] 
         input  shape : {192}         output shape : {192}
        --------------------------------------------------------------
        [ReLU] 
         input  shape : {192}         output shape : {192}
      ----------------------------------------------------------------
      [MicroMlp] 
        --------------------------------------------------------------
        [MicroMlpAffine] 
         input  shape : {192}         output shape : {32}
        --------------------------------------------------------------
        [BatchNormalization] 
         input  shape : {32}         output shape : {32}
        --------------------------------------------------------------
        [ReLU] 
         input  shape : {32}         output shape : {32}
    ------------------------------------------------------------------
    [ConvolutionCol2Im] 
     input  shape : {32}     output shape : {10, 10, 32}
  --------------------------------------------------------------------
  [LoweringConvolution] 
    ------------------------------------------------------------------
    [ConvolutionIm2Col] 
     input  shape : {10, 10, 32}     output shape : {3, 3, 32}
    ------------------------------------------------------------------
    [Sequential] 
      ----------------------------------------------------------------
      [MicroMlp] 
        --------------------------------------------------------------
        [MicroMlpAffine] 
         input  shape : {3, 3, 32}         output shape : {192}
        --------------------------------------------------------------
        [BatchNormalization] 
         input  shape : {192}         output shape : {192}
        --------------------------------------------------------------
        [ReLU] 
         input  shape : {192}         output shape : {192}
      ----------------------------------------------------------------
      [MicroMlp] 
        --------------------------------------------------------------
        [MicroMlpAffine] 
         input  shape : {192}         output shape : {32}
        --------------------------------------------------------------
        [BatchNormalization] 
         input  shape : {32}         output shape : {32}
        --------------------------------------------------------------
        [ReLU] 
         input  shape : {32}         output shape : {32}
    ------------------------------------------------------------------
    [ConvolutionCol2Im] 
     input  shape : {32}     output shape : {8, 8, 32}
  --------------------------------------------------------------------
  [MaxPooling] 
   input  shape : {8, 8, 32}   output shape : {4, 4, 32}
  --------------------------------------------------------------------
  [MicroMlp] 
    ------------------------------------------------------------------
    [MicroMlpAffine] 
     input  shape : {4, 4, 32}     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 : MnistSimpleLutCnn
    124.06s epoch[  1] test_accuracy : 0.7005 train_accuracy : 0.6954          
    289.07s epoch[  2] test_accuracy : 0.7654 train_accuracy : 0.7505          
    452.73s epoch[  3] test_accuracy : 0.8321 train_accuracy : 0.8249          
    608.97s epoch[  4] test_accuracy : 0.8677 train_accuracy : 0.8623          
    763.16s epoch[  5] test_accuracy : 0.8865 train_accuracy : 0.8776          
    918.64s epoch[  6] test_accuracy : 0.8932 train_accuracy : 0.8867          
   1072.93s epoch[  7] test_accuracy : 0.9020 train_accuracy : 0.8948          
   1227.28s epoch[  8] test_accuracy : 0.9118 train_accuracy : 0.9069          
fitting end

fitting start : MnistDenseAffine
[initial] test_accuracy : 0.1566 train_accuracy : 0.1472                       
     94.77s epoch[  1] test_accuracy : 0.8678 train_accuracy : 0.8640          
    195.43s epoch[  2] test_accuracy : 0.9004 train_accuracy : 0.9061          
    294.99s epoch[  3] test_accuracy : 0.9139 train_accuracy : 0.9227          
    395.53s epoch[  4] test_accuracy : 0.9248 train_accuracy : 0.9418          
    495.72s epoch[  5] test_accuracy : 0.9264 train_accuracy : 0.9440          
    595.85s epoch[  6] test_accuracy : 0.9356 train_accuracy : 0.9590          
    696.22s epoch[  7] test_accuracy : 0.9369 train_accuracy : 0.9606          
    796.36s epoch[  8] test_accuracy : 0.9419 train_accuracy : 0.9673          
fitting end

accuracy : 0.153032
accuracy : 0.176794
accuracy : 0.207094
accuracy : 0.216566
accuracy : 0.2188
accuracy : 0.216499
accuracy : 0.219384
accuracy : 0.219834


BinaryBrain/sample/mnist/verilog ディレクトリに MnistSimpleLutMlp.v が生成された。
BinaryBrain_19_190322.png

MnistSimpleLutMlp.v を示す。
BinaryBrain_20_190322.png

最初に、module MnistSimpleLutMlp が定義されている。
  1. 2019年03月22日 04:40 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

BinaryBrain Version 3 を試してみよう2

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

前回、ryuz/BinaryBrain のBinaryBrain Version 3 を Nvidia Docker で試してみたが、コンパイル時にエラーになってしまった。今回は、Docker を使用しないでやってみた。

なお、Nvidia のドライバは入れてある。nvidia-cuda-toolkit も apt でインストールしてある。

もうすでにgit clone は実行されているので、コンパイルからやってみよう。
cd ~/Docker/BinaryBrain/sample/mnist/
make WITH_CUDA=Yes all

BinaryBrain_9_190320.png

うまく行ったようだ。ログを示す。

masaaki@masaaki-H110M4-M01:~/Docker/BinaryBrain/BinaryBrain/sample/mnist$ make WITH_CUDA=Yes all
make -C ../../cuda
make[1]: ディレクトリ '/home/masaaki/Docker/BinaryBrain/BinaryBrain/cuda' に入ります
nvcc -c -I ../include Manager.cu -o Manager.o
nvcc -c -I ../include MicroMlp.cu -o MicroMlp.o
nvcc -c -I ../include Im2Col.cu -o Im2Col.o
nvcc -c -I ../include Col2Im.cu -o Col2Im.o
nvcc -c -I ../include MaxPooling.cu -o MaxPooling.o
nvcc -c -I ../include BatchNormalization.cu -o BatchNormalization.o
nvcc -c -I ../include ReLU.cu -o ReLU.o
nvcc -c -I ../include Binarize.cu -o Binarize.o
nvcc -c -I ../include Vector.cu -o Vector.o
nvcc -c -I ../include HorizontalSum.cu -o HorizontalSum.o
ar rcs libbbcu.a Manager.o MicroMlp.o Im2Col.o Col2Im.o MaxPooling.o BatchNormalization.o ReLU.o Binarize.o Vector.o HorizontalSum.o
make[1]: ディレクトリ '/home/masaaki/Docker/BinaryBrain/BinaryBrain/cuda' から出ます
nvcc -Xcompiler '-O2 -mavx2 -mfma -fopenmp -std=c++14' -I../../include -I../../eigen -I../../cereal/include -DBB_WITH_CEREAL -DBB_WITH_CUDA -c main.cpp
nvcc -Xcompiler '-O2 -mavx2 -mfma -fopenmp -std=c++14' -I../../include -I../../eigen -I../../cereal/include -DBB_WITH_CEREAL -DBB_WITH_CUDA -c MnistSimpleLutMlp.cpp
nvcc -Xcompiler '-O2 -mavx2 -mfma -fopenmp -std=c++14' -I../../include -I../../eigen -I../../cereal/include -DBB_WITH_CEREAL -DBB_WITH_CUDA -c MnistSimpleLutCnn.cpp
nvcc -Xcompiler '-O2 -mavx2 -mfma -fopenmp -std=c++14' -I../../include -I../../eigen -I../../cereal/include -DBB_WITH_CEREAL -DBB_WITH_CUDA -c MnistDenseAffine.cpp
nvcc -Xcompiler '-O2 -mavx2 -mfma -fopenmp -std=c++14' -I../../include -I../../eigen -I../../cereal/include -DBB_WITH_CEREAL -DBB_WITH_CUDA -c MnistSimpleMicroMlpScratch.cpp
nvcc -o sample-mnist -Xcompiler '-O2 -mavx2 -mfma -fopenmp -std=c++14' -I../../include -I../../eigen -I../../cereal/include -DBB_WITH_CEREAL -DBB_WITH_CUDA main.o MnistSimpleLutMlp.o MnistSimpleLutCnn.o MnistDenseAffine.o MnistSimpleMicroMlpScratch.o ../../cuda/libbbcu.a


nvcc のバージョンを見てみた。
nvcc --version
BinaryBrain_10_190320.png

ログを示す。

masaaki@masaaki-H110M4-M01:~/Docker/BinaryBrain/BinaryBrain/sample/mnist$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Nov__3_21:07:56_CDT_2017
Cuda compilation tools, release 9.1, V9.1.85


nvidia-smi を実行した。
BinaryBrain_11_190320.png

make WITH_CUDA=Yes run
BinaryBrain_12_190321.png

うまく行ったようだ。
ログを示す。

masaaki@masaaki-H110M4-M01:~/Docker/BinaryBrain/BinaryBrain/sample/mnist$ make WITH_CUDA=Yes run
wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
--2019-03-20 06:00:28--  http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
yann.lecun.com (yann.lecun.com) をDNSに問いあわせています... 216.165.22.6
yann.lecun.com (yann.lecun.com)|216.165.22.6|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 9912422 (9.5M) [application/x-gzip]
`train-images-idx3-ubyte.gz' に保存中

train-images-idx3-u 100%[===================>]   9.45M  1.75MB/s    時間 9.4s  

2019-03-20 06:00:38 (1.01 MB/s) - `train-images-idx3-ubyte.gz' へ保存完了 [9912422/9912422]

gzip -c -d train-images-idx3-ubyte.gz  > train-images-idx3-ubyte
wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
--2019-03-20 06:00:38--  http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
yann.lecun.com (yann.lecun.com) をDNSに問いあわせています... 216.165.22.6
yann.lecun.com (yann.lecun.com)|216.165.22.6|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 28881 (28K) [application/x-gzip]
`train-labels-idx1-ubyte.gz' に保存中

train-labels-idx1-u 100%[===================>]  28.20K   148KB/s    時間 0.2s  

2019-03-20 06:00:39 (148 KB/s) - `train-labels-idx1-ubyte.gz' へ保存完了 [28881/28881]

gzip -c -d train-labels-idx1-ubyte.gz  > train-labels-idx1-ubyte
wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz
--2019-03-20 06:00:39--  http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz
yann.lecun.com (yann.lecun.com) をDNSに問いあわせています... 216.165.22.6
yann.lecun.com (yann.lecun.com)|216.165.22.6|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1648877 (1.6M) [application/x-gzip]
`t10k-images-idx3-ubyte.gz' に保存中

t10k-images-idx3-ub 100%[===================>]   1.57M   463KB/s    時間 3.6s  

2019-03-20 06:00:43 (443 KB/s) - `t10k-images-idx3-ubyte.gz' へ保存完了 [1648877/1648877]

gzip -c -d t10k-images-idx3-ubyte.gz   > t10k-images-idx3-ubyte
wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz
--2019-03-20 06:00:43--  http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz
yann.lecun.com (yann.lecun.com) をDNSに問いあわせています... 216.165.22.6
yann.lecun.com (yann.lecun.com)|216.165.22.6|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 4542 (4.4K) [application/x-gzip]
`t10k-labels-idx1-ubyte.gz' に保存中

t10k-labels-idx1-ub 100%[===================>]   4.44K  --.-KB/s    時間 0s    

2019-03-20 06:00:43 (174 MB/s) - `t10k-labels-idx1-ubyte.gz' へ保存完了 [4542/4542]

gzip -c -d t10k-labels-idx1-ubyte.gz   > t10k-labels-idx1-ubyte
./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 : {360}
    ------------------------------------------------------------------
    [BatchNormalization] 
     input  shape : {360}     output shape : {360}
    ------------------------------------------------------------------
    [ReLU] 
     input  shape : {360}     output shape : {360}
  --------------------------------------------------------------------
  [MicroMlp] 
    ------------------------------------------------------------------
    [MicroMlpAffine] 
     input  shape : {360}     output shape : {60}
    ------------------------------------------------------------------
    [BatchNormalization] 
     input  shape : {60}     output shape : {60}
    ------------------------------------------------------------------
    [ReLU] 
     input  shape : {60}     output shape : {60}
  --------------------------------------------------------------------
  [BinaryToReal] 
   input  shape : {60}   output shape : {10}
----------------------------------------------------------------------
fitting start : MnistSimpleLutMlp
     12.79s epoch[  1] test_accuracy : 0.8074 train_accuracy : 0.8030          
     28.98s epoch[  2] test_accuracy : 0.8771 train_accuracy : 0.8679          
     44.87s epoch[  3] test_accuracy : 0.8801 train_accuracy : 0.8788          
     61.03s epoch[  4] test_accuracy : 0.8647 train_accuracy : 0.8597          
fitting end

lut_accuracy : 0.8647                                                          
export : MnistSimpleLutMlp.v

binary mode
----------------------------------------------------------------------
[Sequential] 
  --------------------------------------------------------------------
  [RealToBinary] 
   input  shape : {28, 28, 1}   output shape : {28, 28, 1}
  --------------------------------------------------------------------
  [LoweringConvolution] 
    ------------------------------------------------------------------
    [ConvolutionIm2Col] 
     input  shape : {28, 28, 1}     output shape : {3, 3, 1}
    ------------------------------------------------------------------
    [Sequential] 
      ----------------------------------------------------------------
      [MicroMlp] 
        --------------------------------------------------------------
        [MicroMlpAffine] 
         input  shape : {3, 3, 1}         output shape : {192}
        --------------------------------------------------------------
        [BatchNormalization] 
         input  shape : {192}         output shape : {192}
        --------------------------------------------------------------
        [ReLU] 
         input  shape : {192}         output shape : {192}
      ----------------------------------------------------------------
      [MicroMlp] 
        --------------------------------------------------------------
        [MicroMlpAffine] 
         input  shape : {192}         output shape : {32}
        --------------------------------------------------------------
        [BatchNormalization] 
         input  shape : {32}         output shape : {32}
        --------------------------------------------------------------
        [ReLU] 
         input  shape : {32}         output shape : {32}
    ------------------------------------------------------------------
    [ConvolutionCol2Im] 
     input  shape : {32}     output shape : {26, 26, 32}
  --------------------------------------------------------------------
  [LoweringConvolution] 
    ------------------------------------------------------------------
    [ConvolutionIm2Col] 
     input  shape : {26, 26, 32}     output shape : {3, 3, 32}
    ------------------------------------------------------------------
    [Sequential] 
      ----------------------------------------------------------------
      [MicroMlp] 
        --------------------------------------------------------------
        [MicroMlpAffine] 
         input  shape : {3, 3, 32}         output shape : {192}
        --------------------------------------------------------------
        [BatchNormalization] 
         input  shape : {192}         output shape : {192}
        --------------------------------------------------------------
        [ReLU] 
         input  shape : {192}         output shape : {192}
      ----------------------------------------------------------------
      [MicroMlp] 
        --------------------------------------------------------------
        [MicroMlpAffine] 
         input  shape : {192}         output shape : {32}
        --------------------------------------------------------------
        [BatchNormalization] 
         input  shape : {32}         output shape : {32}
        --------------------------------------------------------------
        [ReLU] 
         input  shape : {32}         output shape : {32}
    ------------------------------------------------------------------
    [ConvolutionCol2Im] 
     input  shape : {32}     output shape : {24, 24, 32}
  --------------------------------------------------------------------
  [MaxPooling] 
   input  shape : {24, 24, 32}   output shape : {12, 12, 32}
  --------------------------------------------------------------------
  [LoweringConvolution] 
    ------------------------------------------------------------------
    [ConvolutionIm2Col] 
     input  shape : {12, 12, 32}     output shape : {3, 3, 32}
    ------------------------------------------------------------------
    [Sequential] 
      ----------------------------------------------------------------
      [MicroMlp] 
        --------------------------------------------------------------
        [MicroMlpAffine] 
         input  shape : {3, 3, 32}         output shape : {192}
        --------------------------------------------------------------
        [BatchNormalization] 
         input  shape : {192}         output shape : {192}
        --------------------------------------------------------------
        [ReLU] 
         input  shape : {192}         output shape : {192}
      ----------------------------------------------------------------
      [MicroMlp] 
        --------------------------------------------------------------
        [MicroMlpAffine] 
         input  shape : {192}         output shape : {32}
        --------------------------------------------------------------
        [BatchNormalization] 
         input  shape : {32}         output shape : {32}
        --------------------------------------------------------------
        [ReLU] 
         input  shape : {32}         output shape : {32}
    ------------------------------------------------------------------
    [ConvolutionCol2Im] 
     input  shape : {32}     output shape : {10, 10, 32}
  --------------------------------------------------------------------
  [LoweringConvolution] 
    ------------------------------------------------------------------
    [ConvolutionIm2Col] 
     input  shape : {10, 10, 32}     output shape : {3, 3, 32}
    ------------------------------------------------------------------
    [Sequential] 
      ----------------------------------------------------------------
      [MicroMlp] 
        --------------------------------------------------------------
        [MicroMlpAffine] 
         input  shape : {3, 3, 32}         output shape : {192}
        --------------------------------------------------------------
        [BatchNormalization] 
         input  shape : {192}         output shape : {192}
        --------------------------------------------------------------
        [ReLU] 
         input  shape : {192}         output shape : {192}
      ----------------------------------------------------------------
      [MicroMlp] 
        --------------------------------------------------------------
        [MicroMlpAffine] 
         input  shape : {192}         output shape : {32}
        --------------------------------------------------------------
        [BatchNormalization] 
         input  shape : {32}         output shape : {32}
        --------------------------------------------------------------
        [ReLU] 
         input  shape : {32}         output shape : {32}
    ------------------------------------------------------------------
    [ConvolutionCol2Im] 
     input  shape : {32}     output shape : {8, 8, 32}
  --------------------------------------------------------------------
  [MaxPooling] 
   input  shape : {8, 8, 32}   output shape : {4, 4, 32}
  --------------------------------------------------------------------
  [MicroMlp] 
    ------------------------------------------------------------------
    [MicroMlpAffine] 
     input  shape : {4, 4, 32}     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 : MnistSimpleLutCnn
    130.57s epoch[  1] test_accuracy : 0.7246 train_accuracy : 0.7235          
    304.45s epoch[  2] test_accuracy : 0.8018 train_accuracy : 0.7884          
    474.70s epoch[  3] test_accuracy : 0.8517 train_accuracy : 0.8375          
    645.89s epoch[  4] test_accuracy : 0.8854 train_accuracy : 0.8797          
fitting end

fitting start : MnistDenseAffine
[initial] test_accuracy : 0.1566 train_accuracy : 0.1472                       
     96.61s epoch[  1] test_accuracy : 0.8704 train_accuracy : 0.8643          
    200.47s epoch[  2] test_accuracy : 0.8979 train_accuracy : 0.9049          
    303.05s epoch[  3] test_accuracy : 0.9138 train_accuracy : 0.9224          
    405.96s epoch[  4] test_accuracy : 0.9237 train_accuracy : 0.9414          
fitting end

accuracy : 0.153032
accuracy : 0.176794
accuracy : 0.207094
accuracy : 0.216566


Docker でうまく行かなかったのはなぜなんだろう?設定がうまく行ってなかったか?

MnistSimpleLutMlp.v ができていた。
BinaryBrain_13_190321.png

MnistSimpleLutMlp.v の一部を示す。
BinaryBrain_14_190321.png

Verlog HDL に変換してくれるのね?
  1. 2019年03月21日 04:37 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

BinaryBrain Version 3 を試してみよう1

ryuz/BinaryBrain のBinaryBrain Version 3 を試してみよう。
BinaryBrain はFPGA の6 入力LUT を学習させて推論してしまうというネットワークのようだ。こうするととても少ないロジックでネットワークを構成することができる。

早速、環境を構築していく。
私のホストパソコンの ~/Docker ディレクトリに BinaryBrain ディレクトリを生成する。
mkdir BinaryBrain
cd BinaryBrain

BinaryBrain_1_190319.png

BinaryBrain ディレクトリに入って、ryuz/BinaryBrain のBinaryBrain Version 3 を git clone する。
git clone --recursive -b ver3_release https://github.com/ryuz/BinaryBrain.gitBinaryBrain_2_190319.png

cuda:9.1-devel を取って来て、binarybrainc コンテナを起動する。
nvcc も起動したので、BinaryBrain ディレクトリを生成する。
docker run --runtime=nvidia -ti --rm --name binarybrainc --privileged nvidia/cuda:9.1-devel /bin/bash
nvcc --version
mkdir BinaryBrain

BinaryBrain_3_190320.png

他のホストパソコンのターミナルで binarybrainc コンテナのイメージを binarybrain に書き込む。
docker ps
docker commit binarybrainc binarybrain

BinaryBrain_4_190320.png

binarybrainc コンテナに戻って、exit する。
作っておいた boot.sh を起動して、BinaryBrain ディレクトリを見ると、git clone したデータが入っているのが見える。
exit
./boot.sh
ls BinaryBrain/

BinaryBrain_5_190320.png

boot.sh を貼っておく。

docker run --runtime=nvidia -ti --rm --name binarybrainc --privileged -v /home/masaaki/Docker/BinaryBrain/BinaryBrain:/BinaryBrain binarybrain /bin/bash


CUDA 環境をテストすると大丈夫そうだ。
nvidia-smi
nvcc --version

BinaryBrain_6_190320.png

環境を構築していく。
apt update
apt -y upgrade
apt install -y git g++ make wget

BinaryBrain_7_190320.png

コンパイルしよう。
cd BinaryBrain/sample/mnist
make WITH_CUDA=Yes all

BinaryBrain_8_190320.png

エラーになってしまった。エラー内容を貼っておく。

root@6e7457d040c7:/BinaryBrain/sample/mnist# make WITH_CUDA=Yes all
make -C ../../cuda
make[1]: Entering directory '/BinaryBrain/cuda'
nvcc -c -I ../include Manager.cu -o Manager.o
In file included from /usr/include/c++/5/chrono:35:0,
                 from Manager.cu:2:
/usr/include/c++/5/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
 #error This file requires compiler and library support \
  ^
Makefile:32: recipe for target 'Manager.o' failed
make[1]: *** [Manager.o] Error 1
make[1]: Leaving directory '/BinaryBrain/cuda'
Makefile:68: recipe for target 'bbcu_build' failed
make: *** [bbcu_build] Error 2


CUDAのバージョンが 9.1 なので、-std=c++11 使えということかな?
  1. 2019年03月20日 05:19 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

keras_compressor を試してみる5(Cifer10 その2)

keras_compressor を試してみる4(Cifer10 その1)”の続き。

前回は、Cifar10 のトレーニング、圧縮、ファイン・チューニングを行った。今回は生成された 3 つのモデルの評価を行う。

最初に圧縮なしから評価してみよう。
python3 evaluate.py model_raw.h5
keras_compressor_37_190305.png

ロスが 0.41 程度で精度が約 87.3 % だった。
ログを示す。

root@d97b3c148a5b:/srv/keras_compressor/example/cifar10# python3 evaluate.py model_raw.h5 
Using TensorFlow backend.
2019-03-04 19:57:25.202654: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 32, 32, 3)         0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 32, 32, 64)        1792      
_________________________________________________________________
batch_normalization_1 (Batch (None, 32, 32, 64)        256       
_________________________________________________________________
dropout_1 (Dropout)          (None, 32, 32, 64)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 32, 32, 64)        36928     
_________________________________________________________________
batch_normalization_2 (Batch (None, 32, 32, 64)        256       
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 16, 16, 64)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 16, 16, 128)       73856     
_________________________________________________________________
batch_normalization_3 (Batch (None, 16, 16, 128)       512       
_________________________________________________________________
dropout_2 (Dropout)          (None, 16, 16, 128)       0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 16, 16, 128)       147584    
_________________________________________________________________
batch_normalization_4 (Batch (None, 16, 16, 128)       512       
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 8, 8, 128)         0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 8, 8, 256)         295168    
_________________________________________________________________
batch_normalization_5 (Batch (None, 8, 8, 256)         1024      
_________________________________________________________________
dropout_3 (Dropout)          (None, 8, 8, 256)         0         
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 8, 8, 256)         590080    
_________________________________________________________________
batch_normalization_6 (Batch (None, 8, 8, 256)         1024      
_________________________________________________________________
dropout_4 (Dropout)          (None, 8, 8, 256)         0         
_________________________________________________________________
conv2d_7 (Conv2D)            (None, 8, 8, 256)         590080    
_________________________________________________________________
batch_normalization_7 (Batch (None, 8, 8, 256)         1024      
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 4, 4, 256)         0         
_________________________________________________________________
conv2d_8 (Conv2D)            (None, 4, 4, 512)         1180160   
_________________________________________________________________
batch_normalization_8 (Batch (None, 4, 4, 512)         2048      
_________________________________________________________________
dropout_5 (Dropout)          (None, 4, 4, 512)         0         
_________________________________________________________________
conv2d_9 (Conv2D)            (None, 4, 4, 512)         2359808   
_________________________________________________________________
batch_normalization_9 (Batch (None, 4, 4, 512)         2048      
_________________________________________________________________
dropout_6 (Dropout)          (None, 4, 4, 512)         0         
_________________________________________________________________
conv2d_10 (Conv2D)           (None, 4, 4, 512)         2359808   
_________________________________________________________________
batch_normalization_10 (Batc (None, 4, 4, 512)         2048      
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 2, 2, 512)         0         
_________________________________________________________________
conv2d_11 (Conv2D)           (None, 2, 2, 512)         2359808   
_________________________________________________________________
batch_normalization_11 (Batc (None, 2, 2, 512)         2048      
_________________________________________________________________
dropout_7 (Dropout)          (None, 2, 2, 512)         0         
_________________________________________________________________
conv2d_12 (Conv2D)           (None, 2, 2, 512)         2359808   
_________________________________________________________________
batch_normalization_12 (Batc (None, 2, 2, 512)         2048      
_________________________________________________________________
dropout_8 (Dropout)          (None, 2, 2, 512)         0         
_________________________________________________________________
conv2d_13 (Conv2D)           (None, 2, 2, 512)         2359808   
_________________________________________________________________
batch_normalization_13 (Batc (None, 2, 2, 512)         2048      
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 1, 1, 512)         0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 512)               0         
_________________________________________________________________
dropout_9 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 512)               262656    
_________________________________________________________________
batch_normalization_14 (Batc (None, 512)               2048      
_________________________________________________________________
dropout_10 (Dropout)         (None, 512)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                5130      
=================================================================
Total params: 15,001,418
Trainable params: 14,991,946
Non-trainable params: 9,472
_________________________________________________________________
[0.4078139572441578, 0.8732]


次に圧縮したモデルを評価する。
python3 evaluate.py model_compressed.h5
keras_compressor_38_190305.png

ロスは 0.72 程度、精度は約 77.9 % だった。
ログを示す。

root@d97b3c148a5b:/srv/keras_compressor/example/cifar10# python3 evaluate.py model_compressed.h5
Using TensorFlow backend.
2019-03-04 20:01:08.106457: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 32, 32, 3)         0         
_________________________________________________________________
conv2d_1 (FactorizedConv2DTu (None, 32, 32, 64)        1429      
_________________________________________________________________
batch_normalization_1 (Batch (None, 32, 32, 64)        256       
_________________________________________________________________
dropout_1 (Dropout)          (None, 32, 32, 64)        0         
_________________________________________________________________
conv2d_2 (FactorizedConv2DTu (None, 32, 32, 64)        24384     
_________________________________________________________________
batch_normalization_2 (Batch (None, 32, 32, 64)        256       
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 16, 16, 64)        0         
_________________________________________________________________
conv2d_3 (FactorizedConv2DTu (None, 16, 16, 128)       47552     
_________________________________________________________________
batch_normalization_3 (Batch (None, 16, 16, 128)       512       
_________________________________________________________________
dropout_2 (Dropout)          (None, 16, 16, 128)       0         
_________________________________________________________________
conv2d_4 (FactorizedConv2DTu (None, 16, 16, 128)       116608    
_________________________________________________________________
batch_normalization_4 (Batch (None, 16, 16, 128)       512       
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 8, 8, 128)         0         
_________________________________________________________________
conv2d_5 (FactorizedConv2DTu (None, 8, 8, 256)         204544    
_________________________________________________________________
batch_normalization_5 (Batch (None, 8, 8, 256)         1024      
_________________________________________________________________
dropout_3 (Dropout)          (None, 8, 8, 256)         0         
_________________________________________________________________
conv2d_6 (FactorizedConv2DTu (None, 8, 8, 256)         404736    
_________________________________________________________________
batch_normalization_6 (Batch (None, 8, 8, 256)         1024      
_________________________________________________________________
dropout_4 (Dropout)          (None, 8, 8, 256)         0         
_________________________________________________________________
conv2d_7 (FactorizedConv2DTu (None, 8, 8, 256)         371456    
_________________________________________________________________
batch_normalization_7 (Batch (None, 8, 8, 256)         1024      
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 4, 4, 256)         0         
_________________________________________________________________
conv2d_8 (FactorizedConv2DTu (None, 4, 4, 512)         406377    
_________________________________________________________________
batch_normalization_8 (Batch (None, 4, 4, 512)         2048      
_________________________________________________________________
dropout_5 (Dropout)          (None, 4, 4, 512)         0         
_________________________________________________________________
conv2d_9 (FactorizedConv2DTu (None, 4, 4, 512)         1300992   
_________________________________________________________________
batch_normalization_9 (Batch (None, 4, 4, 512)         2048      
_________________________________________________________________
dropout_6 (Dropout)          (None, 4, 4, 512)         0         
_________________________________________________________________
conv2d_10 (FactorizedConv2DT (None, 4, 4, 512)         394752    
_________________________________________________________________
batch_normalization_10 (Batc (None, 4, 4, 512)         2048      
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 2, 2, 512)         0         
_________________________________________________________________
conv2d_11 (FactorizedConv2DT (None, 2, 2, 512)         103437    
_________________________________________________________________
batch_normalization_11 (Batc (None, 2, 2, 512)         2048      
_________________________________________________________________
dropout_7 (Dropout)          (None, 2, 2, 512)         0         
_________________________________________________________________
conv2d_12 (FactorizedConv2DT (None, 2, 2, 512)         1326592   
_________________________________________________________________
batch_normalization_12 (Batc (None, 2, 2, 512)         2048      
_________________________________________________________________
dropout_8 (Dropout)          (None, 2, 2, 512)         0         
_________________________________________________________________
conv2d_13 (FactorizedConv2DT (None, 2, 2, 512)         1260032   
_________________________________________________________________
batch_normalization_13 (Batc (None, 2, 2, 512)         2048      
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 1, 1, 512)         0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 512)               0         
_________________________________________________________________
dropout_9 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_1 (FactorizedDense)    (None, 512)               190976    
_________________________________________________________________
batch_normalization_14 (Batc (None, 512)               2048      
_________________________________________________________________
dropout_10 (Dropout)         (None, 512)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                5130      
=================================================================
Total params: 6,177,941
Trainable params: 6,168,469
Non-trainable params: 9,472
_________________________________________________________________
[0.7183663519859314, 0.7791]


圧縮後にファイン・チューニングしたモデルを示す。
python3 evaluate.py model_finetuned.h5
keras_compressor_39_190305.png

ロスは、0.45 程度、精度は 87.5 % 程度で改善している。
ログを示す。

root@d97b3c148a5b:/srv/keras_compressor/example/cifar10# python3 evaluate.py model_finetuned.h5
Using TensorFlow backend.
2019-03-04 20:03:16.616118: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 32, 32, 3)         0         
_________________________________________________________________
conv2d_1 (FactorizedConv2DTu (None, 32, 32, 64)        1429      
_________________________________________________________________
batch_normalization_1 (Batch (None, 32, 32, 64)        256       
_________________________________________________________________
dropout_1 (Dropout)          (None, 32, 32, 64)        0         
_________________________________________________________________
conv2d_2 (FactorizedConv2DTu (None, 32, 32, 64)        24384     
_________________________________________________________________
batch_normalization_2 (Batch (None, 32, 32, 64)        256       
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 16, 16, 64)        0         
_________________________________________________________________
conv2d_3 (FactorizedConv2DTu (None, 16, 16, 128)       47552     
_________________________________________________________________
batch_normalization_3 (Batch (None, 16, 16, 128)       512       
_________________________________________________________________
dropout_2 (Dropout)          (None, 16, 16, 128)       0         
_________________________________________________________________
conv2d_4 (FactorizedConv2DTu (None, 16, 16, 128)       116608    
_________________________________________________________________
batch_normalization_4 (Batch (None, 16, 16, 128)       512       
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 8, 8, 128)         0         
_________________________________________________________________
conv2d_5 (FactorizedConv2DTu (None, 8, 8, 256)         204544    
_________________________________________________________________
batch_normalization_5 (Batch (None, 8, 8, 256)         1024      
_________________________________________________________________
dropout_3 (Dropout)          (None, 8, 8, 256)         0         
_________________________________________________________________
conv2d_6 (FactorizedConv2DTu (None, 8, 8, 256)         404736    
_________________________________________________________________
batch_normalization_6 (Batch (None, 8, 8, 256)         1024      
_________________________________________________________________
dropout_4 (Dropout)          (None, 8, 8, 256)         0         
_________________________________________________________________
conv2d_7 (FactorizedConv2DTu (None, 8, 8, 256)         371456    
_________________________________________________________________
batch_normalization_7 (Batch (None, 8, 8, 256)         1024      
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 4, 4, 256)         0         
_________________________________________________________________
conv2d_8 (FactorizedConv2DTu (None, 4, 4, 512)         406377    
_________________________________________________________________
batch_normalization_8 (Batch (None, 4, 4, 512)         2048      
_________________________________________________________________
dropout_5 (Dropout)          (None, 4, 4, 512)         0         
_________________________________________________________________
conv2d_9 (FactorizedConv2DTu (None, 4, 4, 512)         1300992   
_________________________________________________________________
batch_normalization_9 (Batch (None, 4, 4, 512)         2048      
_________________________________________________________________
dropout_6 (Dropout)          (None, 4, 4, 512)         0         
_________________________________________________________________
conv2d_10 (FactorizedConv2DT (None, 4, 4, 512)         394752    
_________________________________________________________________
batch_normalization_10 (Batc (None, 4, 4, 512)         2048      
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 2, 2, 512)         0         
_________________________________________________________________
conv2d_11 (FactorizedConv2DT (None, 2, 2, 512)         103437    
_________________________________________________________________
batch_normalization_11 (Batc (None, 2, 2, 512)         2048      
_________________________________________________________________
dropout_7 (Dropout)          (None, 2, 2, 512)         0         
_________________________________________________________________
conv2d_12 (FactorizedConv2DT (None, 2, 2, 512)         1326592   
_________________________________________________________________
batch_normalization_12 (Batc (None, 2, 2, 512)         2048      
_________________________________________________________________
dropout_8 (Dropout)          (None, 2, 2, 512)         0         
_________________________________________________________________
conv2d_13 (FactorizedConv2DT (None, 2, 2, 512)         1260032   
_________________________________________________________________
batch_normalization_13 (Batc (None, 2, 2, 512)         2048      
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 1, 1, 512)         0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 512)               0         
_________________________________________________________________
dropout_9 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_1 (FactorizedDense)    (None, 512)               190976    
_________________________________________________________________
batch_normalization_14 (Batc (None, 512)               2048      
_________________________________________________________________
dropout_10 (Dropout)         (None, 512)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                5130      
=================================================================
Total params: 6,177,941
Trainable params: 6,168,469
Non-trainable params: 9,472
_________________________________________________________________
[0.4548675367474556, 0.8746]

  1. 2019年03月08日 04:25 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

keras_compressor を試してみる4(Cifer10 その1)

keras_compressor を試してみる3”の続き。

前回は、MNIST のトレーニングと圧縮、ファイン・チューニングを行ったときのモデルを評価した。今回は、cifar10 の場合をやってみよう。トレーニング、圧縮、ファイン・チューニングを行う。

/srv/keras_compressor/example/cifar10 ディレクトリに移動した。

python3 train.py
を実行した。結構時間がかかった。なお、Epoch は 300 から 30 に変更してある。
keras_compressor_40_190305.png

ログを示す。

root@7552a77f8bdb:/srv/keras_compressor/example/cifar10# python3 train.py
Using TensorFlow backend.
Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
170500096/170498071 [==============================] - 43s 0us/step
2019-02-27 11:54:10.618893: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
Epoch 1/30
390/390 [==============================] - 1912s 5s/step - loss: 2.4666 - acc: 0.2015 - val_loss: 7.8723 - val_acc: 0.1599
Epoch 2/30
390/390 [==============================] - 1951s 5s/step - loss: 1.7865 - acc: 0.3543 - val_loss: 1.7953 - val_acc: 0.4245
Epoch 3/30
390/390 [==============================] - 1884s 5s/step - loss: 1.4745 - acc: 0.4727 - val_loss: 1.4443 - val_acc: 0.5675
Epoch 4/30
390/390 [==============================] - 1782s 5s/step - loss: 1.2430 - acc: 0.5594 - val_loss: 1.3947 - val_acc: 0.5735
Epoch 5/30
390/390 [==============================] - 1748s 4s/step - loss: 1.0835 - acc: 0.6209 - val_loss: 1.3739 - val_acc: 0.6071
Epoch 6/30
390/390 [==============================] - 1745s 4s/step - loss: 0.9651 - acc: 0.6626 - val_loss: 1.0916 - val_acc: 0.6663
Epoch 7/30
390/390 [==============================] - 1752s 4s/step - loss: 0.8771 - acc: 0.6987 - val_loss: 1.0480 - val_acc: 0.6722
Epoch 8/30
390/390 [==============================] - 1752s 4s/step - loss: 0.8071 - acc: 0.7265 - val_loss: 0.8734 - val_acc: 0.7279
Epoch 9/30
390/390 [==============================] - 1749s 4s/step - loss: 0.7478 - acc: 0.7471 - val_loss: 1.0155 - val_acc: 0.7233
Epoch 10/30
390/390 [==============================] - 1749s 4s/step - loss: 0.6909 - acc: 0.7667 - val_loss: 0.7561 - val_acc: 0.7607
Epoch 11/30
390/390 [==============================] - 1749s 4s/step - loss: 0.6446 - acc: 0.7844 - val_loss: 0.6690 - val_acc: 0.7949
Epoch 12/30
390/390 [==============================] - 1747s 4s/step - loss: 0.6114 - acc: 0.7944 - val_loss: 0.7836 - val_acc: 0.7496
Epoch 13/30
390/390 [==============================] - 1747s 4s/step - loss: 0.5827 - acc: 0.8051 - val_loss: 0.5952 - val_acc: 0.8103
Epoch 14/30
390/390 [==============================] - 1801s 5s/step - loss: 0.5528 - acc: 0.8158 - val_loss: 0.5906 - val_acc: 0.8136
Epoch 15/30
390/390 [==============================] - 1961s 5s/step - loss: 0.5323 - acc: 0.8242 - val_loss: 0.6216 - val_acc: 0.8075
Epoch 16/30
390/390 [==============================] - 1902s 5s/step - loss: 0.5109 - acc: 0.8314 - val_loss: 0.5732 - val_acc: 0.8223
Epoch 17/30
390/390 [==============================] - 1934s 5s/step - loss: 0.4924 - acc: 0.8364 - val_loss: 0.4982 - val_acc: 0.8401
Epoch 18/30
390/390 [==============================] - 1935s 5s/step - loss: 0.4725 - acc: 0.8434 - val_loss: 0.4574 - val_acc: 0.8530
Epoch 19/30
390/390 [==============================] - 1795s 5s/step - loss: 0.4565 - acc: 0.8500 - val_loss: 0.5249 - val_acc: 0.8385
Epoch 20/30
390/390 [==============================] - 1901s 5s/step - loss: 0.4390 - acc: 0.8550 - val_loss: 0.4785 - val_acc: 0.8479
Epoch 21/30
390/390 [==============================] - 1809s 5s/step - loss: 0.4292 - acc: 0.8586 - val_loss: 0.4610 - val_acc: 0.8519
Epoch 22/30
390/390 [==============================] - 1774s 5s/step - loss: 0.4165 - acc: 0.8628 - val_loss: 0.4749 - val_acc: 0.8519
Epoch 23/30
390/390 [==============================] - 1748s 4s/step - loss: 0.3972 - acc: 0.8683 - val_loss: 0.4325 - val_acc: 0.8588
Epoch 24/30
390/390 [==============================] - 1747s 4s/step - loss: 0.3952 - acc: 0.8693 - val_loss: 0.3984 - val_acc: 0.8765
Epoch 25/30
390/390 [==============================] - 1745s 4s/step - loss: 0.3757 - acc: 0.8756 - val_loss: 0.4028 - val_acc: 0.8751
Epoch 26/30
390/390 [==============================] - 1745s 4s/step - loss: 0.3710 - acc: 0.8782 - val_loss: 0.4182 - val_acc: 0.8664
Epoch 27/30
390/390 [==============================] - 1744s 4s/step - loss: 0.3618 - acc: 0.8805 - val_loss: 0.4620 - val_acc: 0.8596
Epoch 28/30
390/390 [==============================] - 1744s 4s/step - loss: 0.3514 - acc: 0.8834 - val_loss: 0.4346 - val_acc: 0.8647
Epoch 29/30
390/390 [==============================] - 1743s 4s/step - loss: 0.3489 - acc: 0.8850 - val_loss: 0.4305 - val_acc: 0.8691
Epoch 30/30
390/390 [==============================] - 1741s 4s/step - loss: 0.3379 - acc: 0.8889 - val_loss: 0.4078 - val_acc: 0.8732
10000/10000 [==============================] - 54s 5ms/step
test accuracy:  0.8732
Exception ignored in: <function WeakValueDictionary.__init__.<locals>.remove at 0x7f5161db37b8>
Traceback (most recent call last):
  File "/usr/lib/python3.5/weakref.py", line 117, in remove
TypeError: 'NoneType' object is not callable


model_raw.h5 が生成された。

次に、model_raw.h5 を圧縮してみよう。
python3 compress.py
keras_compressor_34_190304.png

ログを示す。

root@d97b3c148a5b:/srv/keras_compressor/example/cifar10# python3 compress.py 
Using TensorFlow backend.
2019-03-01 23:20:22.197342: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
INFO:keras_compressor.compressor:factorizer not found layer:<keras.engine.input_layer.InputLayer object at 0x7f1965e241d0>
INFO:keras_compressor.compressor:factorizer found layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e24240> factorizer:<class 'keras_compressor.factorizers.tucker.TuckerFactorizer'>
/usr/local/lib/python3.5/dist-packages/keras_compressor/factorizers/tucker.py:97: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  return W[sli]
INFO:keras_compressor.compressor:swap old/new layer old_layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e24240> new_layer<keras_compressor.layers.FactorizedConv2DTucker object at 0x7f194d572d30>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.normalization.BatchNormalization object at 0x7f1965e247b8>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.core.Dropout object at 0x7f1965e24630>
INFO:keras_compressor.compressor:factorizer found layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e24908> factorizer:<class 'keras_compressor.factorizers.tucker.TuckerFactorizer'>
INFO:keras_compressor.compressor:swap old/new layer old_layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e24908> new_layer<keras_compressor.layers.FactorizedConv2DTucker object at 0x7f194d560a20>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.normalization.BatchNormalization object at 0x7f1965e24828>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.pooling.MaxPooling2D object at 0x7f1965e24a90>
INFO:keras_compressor.compressor:factorizer found layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e24ba8> factorizer:<class 'keras_compressor.factorizers.tucker.TuckerFactorizer'>
INFO:keras_compressor.compressor:swap old/new layer old_layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e24ba8> new_layer<keras_compressor.layers.FactorizedConv2DTucker object at 0x7f194c2288d0>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.normalization.BatchNormalization object at 0x7f1965e24c50>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.core.Dropout object at 0x7f1965e24dd8>
INFO:keras_compressor.compressor:factorizer found layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e24ef0> factorizer:<class 'keras_compressor.factorizers.tucker.TuckerFactorizer'>
INFO:keras_compressor.compressor:swap old/new layer old_layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e24ef0> new_layer<keras_compressor.layers.FactorizedConv2DTucker object at 0x7f194d560978>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.normalization.BatchNormalization object at 0x7f1965e380f0>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.pooling.MaxPooling2D object at 0x7f1965e38208>
INFO:keras_compressor.compressor:factorizer found layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e382b0> factorizer:<class 'keras_compressor.factorizers.tucker.TuckerFactorizer'>
INFO:keras_compressor.compressor:swap old/new layer old_layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e382b0> new_layer<keras_compressor.layers.FactorizedConv2DTucker object at 0x7f194d5608d0>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.normalization.BatchNormalization object at 0x7f1965e38438>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.core.Dropout object at 0x7f1965e38550>
INFO:keras_compressor.compressor:factorizer found layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e38588> factorizer:<class 'keras_compressor.factorizers.tucker.TuckerFactorizer'>
INFO:keras_compressor.compressor:swap old/new layer old_layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e38588> new_layer<keras_compressor.layers.FactorizedConv2DTucker object at 0x7f194c4e2a58>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.normalization.BatchNormalization object at 0x7f1965e38710>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.core.Dropout object at 0x7f1965e38828>
INFO:keras_compressor.compressor:factorizer found layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e38860> factorizer:<class 'keras_compressor.factorizers.tucker.TuckerFactorizer'>
INFO:keras_compressor.compressor:swap old/new layer old_layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e38860> new_layer<keras_compressor.layers.FactorizedConv2DTucker object at 0x7f194c20c208>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.normalization.BatchNormalization object at 0x7f1965e389e8>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.pooling.MaxPooling2D object at 0x7f1965e38b00>
INFO:keras_compressor.compressor:factorizer found layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e38ba8> factorizer:<class 'keras_compressor.factorizers.tucker.TuckerFactorizer'>
INFO:keras_compressor.compressor:swap old/new layer old_layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e38ba8> new_layer<keras_compressor.layers.FactorizedConv2DTucker object at 0x7f194c4b6400>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.normalization.BatchNormalization object at 0x7f1965e38d30>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.core.Dropout object at 0x7f1965e38e48>
INFO:keras_compressor.compressor:factorizer found layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e38e80> factorizer:<class 'keras_compressor.factorizers.tucker.TuckerFactorizer'>
INFO:keras_compressor.compressor:swap old/new layer old_layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e38e80> new_layer<keras_compressor.layers.FactorizedConv2DTucker object at 0x7f194c4b6470>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.normalization.BatchNormalization object at 0x7f1965e3c048>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.core.Dropout object at 0x7f1965e3c160>
INFO:keras_compressor.compressor:factorizer found layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e3c198> factorizer:<class 'keras_compressor.factorizers.tucker.TuckerFactorizer'>
INFO:keras_compressor.compressor:swap old/new layer old_layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e3c198> new_layer<keras_compressor.layers.FactorizedConv2DTucker object at 0x7f194c473048>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.normalization.BatchNormalization object at 0x7f1965e3c320>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.pooling.MaxPooling2D object at 0x7f1965e3c438>
INFO:keras_compressor.compressor:factorizer found layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e3c4e0> factorizer:<class 'keras_compressor.factorizers.tucker.TuckerFactorizer'>
INFO:keras_compressor.compressor:swap old/new layer old_layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e3c4e0> new_layer<keras_compressor.layers.FactorizedConv2DTucker object at 0x7f194c4441d0>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.normalization.BatchNormalization object at 0x7f1965e3c668>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.core.Dropout object at 0x7f1965e3c780>
INFO:keras_compressor.compressor:factorizer found layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e3c7b8> factorizer:<class 'keras_compressor.factorizers.tucker.TuckerFactorizer'>
INFO:keras_compressor.compressor:swap old/new layer old_layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e3c7b8> new_layer<keras_compressor.layers.FactorizedConv2DTucker object at 0x7f194c4007b8>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.normalization.BatchNormalization object at 0x7f1965e3c940>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.core.Dropout object at 0x7f1965e3ca58>
INFO:keras_compressor.compressor:factorizer found layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e3ca90> factorizer:<class 'keras_compressor.factorizers.tucker.TuckerFactorizer'>
INFO:keras_compressor.compressor:swap old/new layer old_layer:<keras.layers.convolutional.Conv2D object at 0x7f1965e3ca90> new_layer<keras_compressor.layers.FactorizedConv2DTucker object at 0x7f194c423860>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.normalization.BatchNormalization object at 0x7f1965e3cc18>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.pooling.MaxPooling2D object at 0x7f1965e3cd30>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.core.Flatten object at 0x7f1965e3cdd8>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.core.Dropout object at 0x7f1965e3ce48>
INFO:keras_compressor.compressor:factorizer found layer:<keras.layers.core.Dense object at 0x7f1965e3ce80> factorizer:<class 'keras_compressor.factorizers.svd.SVDFactorizer'>
INFO:keras_compressor.compressor:swap old/new layer old_layer:<keras.layers.core.Dense object at 0x7f1965e3ce80> new_layer<keras_compressor.layers.FactorizedDense object at 0x7f194c400390>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.normalization.BatchNormalization object at 0x7f1965e24f28>
INFO:keras_compressor.compressor:factorizer not found layer:<keras.layers.core.Dropout object at 0x7f1965e41128>
INFO:keras_compressor.compressor:factorizer found layer:<keras.layers.core.Dense object at 0x7f1965e41160> factorizer:<class 'keras_compressor.factorizers.svd.SVDFactorizer'>
INFO:keras_compressor.compressor:swap old/new layer old_layer:<keras.layers.core.Dense object at 0x7f1965e41160> new_layer<keras_compressor.layers.FactorizedDense object at 0x7f194c473c88>


CPU で約 2 日ほどかかったが無事に終了した。
model_compressed.h5 が生成された。

ファイン・チューニングを行った。
python3 finetune.py
keras_compressor_35_190305.png

ログを示す。

root@d97b3c148a5b:/srv/keras_compressor/example/cifar10# python3 finetune.py 
Using TensorFlow backend.
2019-03-04 10:28:24.897016: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
Train on 50000 samples, validate on 10000 samples
Epoch 1/12
50000/50000 [==============================] - 1173s 23ms/step - loss: 0.4078 - acc: 0.8675 - val_loss: 0.5818 - val_acc: 0.8507
Epoch 2/12
50000/50000 [==============================] - 1145s 23ms/step - loss: 0.3782 - acc: 0.8792 - val_loss: 0.5374 - val_acc: 0.8652
Epoch 3/12
50000/50000 [==============================] - 1147s 23ms/step - loss: 0.3508 - acc: 0.8871 - val_loss: 0.5719 - val_acc: 0.8484
Epoch 4/12
50000/50000 [==============================] - 1248s 25ms/step - loss: 0.3341 - acc: 0.8932 - val_loss: 0.5094 - val_acc: 0.8608
Epoch 5/12
50000/50000 [==============================] - 1202s 24ms/step - loss: 0.3174 - acc: 0.8996 - val_loss: 0.4677 - val_acc: 0.8692
Epoch 6/12
50000/50000 [==============================] - 1176s 24ms/step - loss: 0.2963 - acc: 0.9078 - val_loss: 0.5108 - val_acc: 0.8607
Epoch 7/12
50000/50000 [==============================] - 1144s 23ms/step - loss: 0.2823 - acc: 0.9098 - val_loss: 0.4984 - val_acc: 0.8639
Epoch 8/12
50000/50000 [==============================] - 1240s 25ms/step - loss: 0.2745 - acc: 0.9127 - val_loss: 0.5567 - val_acc: 0.8437
Epoch 9/12
50000/50000 [==============================] - 1198s 24ms/step - loss: 0.2633 - acc: 0.9153 - val_loss: 0.5219 - val_acc: 0.8593
Epoch 10/12
50000/50000 [==============================] - 1143s 23ms/step - loss: 0.2464 - acc: 0.9186 - val_loss: 0.4763 - val_acc: 0.8751
Epoch 11/12
50000/50000 [==============================] - 1131s 23ms/step - loss: 0.2361 - acc: 0.9249 - val_loss: 0.4395 - val_acc: 0.8782
Epoch 12/12
50000/50000 [==============================] - 1132s 23ms/step - loss: 0.2301 - acc: 0.9275 - val_loss: 0.4549 - val_acc: 0.8746
10000/10000 [==============================] - 42s 4ms/step
test accuracy:  0.8746


model_finetuned.h5 が生成された。

全てのモデルの大きさを見てみよう。
keras_compressor_36_190305.png

model_copressed.h5 と model_finetuned.h5 は model_raw.h5 の約 40 % になっていることが分かった。
  1. 2019年03月07日 04:46 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

keras_compressor のモデルをVivado HLSで実装する4(model_raw.h5 全結合層第2層目)

keras_compressor のモデルをVivado HLSで実装する3(model_raw.h5 全結合層第1層目)”の続き。

前回は、keras compressor のMNIST サンプルの model_raw.h5 の全結合層の第1層目を解析した。今回は、全結合層の第2層目をやってみよう。

model.summary() で取得した各層の情報を元に全結合層第2層目の中間出力を取り出す。

from keras.models import Model

dense_layer2_name = 'dense_2'

dense_layer2 = model_raw.get_layer(dense_layer2_name)
dense_layer2_wb = dense_layer2.get_weights()

dense_layer2_model = Model(inputs=model_raw.input,
outputs=model_raw.get_layer(dense_layer2_name).output)
dense_layer2_output = dense_layer2_model.predict(x_test, verbose=1)


10000/10000 [==============================] - 5s 491us/step


統計情報を示す。

import numpy as np
dense_layer2_weight = dense_layer2_wb[0]
dense_layer2_bias = dense_layer2_wb[1]

print(dense_layer2_weight.shape)
print(dense_layer2_bias.shape)

print("dense_layer2_weight = {0}".format(dense_layer2_weight))
print("dense_layer2_bias = {0}".format(dense_layer2_bias))

print("np.max(dense_layer2_weight) = {0}".format(np.max(dense_layer2_weight)))
print("np.min(dense_layer2_weight) = {0}".format(np.min(dense_layer2_weight)))
abs_dense_layer2_weight = np.absolute(dense_layer2_weight)
print("np.max(abs_dense_layer2_weight) = {0}".format(np.max(abs_dense_layer2_weight)))
print("np.min(abs_dense_layer2_weight) = {0}".format(np.min(abs_dense_layer2_weight)))

print("np.max(dense_layer2_bias) = {0}".format(np.max(dense_layer2_bias)))
print("np.min(dense_layer2_bias) = {0}".format(np.min(dense_layer2_bias)))
abs_dense_layer2_bias = np.absolute(dense_layer2_bias)
print("np.max(abs_dense_layer2_bias) = {0}".format(np.max(abs_dense_layer2_bias)))
print("np.min(abs_dense_layer2_bias) = {0}".format(np.min(abs_dense_layer2_bias)))

print("dense_layer2_output = {0}".format(dense_layer2_output.shape))
print("np.std(dense_layer2_output) = {0}".format(np.std(dense_layer2_output)))
print("np.max(dense_layer2_output) = {0}".format(np.max(dense_layer2_output)))
print("np.min(dense_layer2_output) = {0}".format(np.min(dense_layer2_output)))

abs_dense_layer2_output = np.absolute(dense_layer2_output)
print("np.max(abs_dense_layer2_output) = {0}".format(np.max(abs_dense_layer2_output)))
print("np.min(abs_dense_layer2_output) = {0}".format(np.min(abs_dense_layer2_output)))


(128, 10)
(10,)
dense_layer2_weight = [[-0.39988974 -0.12601139 -0.46622646 ... -0.44695276 -0.46335962
   0.13559648]
 [ 0.07339579 -0.45668814 -0.333825   ... -0.7270869   0.17933416
  -0.5707154 ]
 [ 0.06677974 -0.5544925   0.1668607  ... -0.46047652 -0.4375593
  -0.05378945]
 ...
 [-0.05012963 -0.112903   -0.1406179  ...  0.16494776  0.20007576
  -0.21182767]
 [-0.5350573  -0.40777698  0.19234389 ...  0.19444552 -0.33254635
  -0.54401803]
 [-0.52111495 -0.26989737  0.20298809 ...  0.08232445  0.14694539
  -0.36222363]]
dense_layer2_bias = [ 0.04120593  0.23183034  0.00655218 -0.07728817 -0.09058365 -0.0624351
 -0.14979938 -0.04618856 -0.06826726 -0.0130224 ]
np.max(dense_layer2_weight) = 0.39613091945648193
np.min(dense_layer2_weight) = -1.0431485176086426
np.max(abs_dense_layer2_weight) = 1.0431485176086426
np.min(abs_dense_layer2_weight) = 0.0008003973634913564
np.max(dense_layer2_bias) = 0.23183034360408783
np.min(dense_layer2_bias) = -0.1497993767261505
np.max(abs_dense_layer2_bias) = 0.23183034360408783
np.min(abs_dense_layer2_bias) = 0.00655217794701457
dense_layer2_output = (10000, 10)
np.std(dense_layer2_output) = 0.29531362652778625
np.max(dense_layer2_output) = 1.0
np.min(dense_layer2_output) = 3.318871697834195e-19
np.max(abs_dense_layer2_output) = 1.0
np.min(abs_dense_layer2_output) = 3.318871697834195e-19


全結合層第2層目の重みのグラフを示す。

# Dence layer2のweightのグラフ
dense_layer2_weight_f = dense_layer2_weight.flatten()
plt.plot(dense_layer2_weight_f)
plt.title('dense_layer2_weight')
plt.show()


keras_compressor_54_190307.png

全結合層第2層目のバイアスのグラフを示す。

# Dence layer1のbiasのグラフ
dence_layer1_bias_f = dence_layer1_bias.flatten()
plt.plot(dence_layer1_bias_f)
plt.title('dence_layer1_bias')
plt.show()


keras_compressor_55_190307.png
  1. 2019年03月07日 04:17 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0
»