FC2カウンター FPGAの部屋 2018年06月10日
FC2ブログ

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

FPGAの部屋

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

TensorFlow + Kerasを使ってみた15(飽和演算と通常の演算)

TensorFlow + Kerasを使ってみた14(Vivado HLSで実装2)”の続き。

前回は、Keras から重みやバイアスを取り出して、Vivado HLS 2017.4 に実装したCNN をC シミュレーションしたところ、ソフトウェアのfloat 演算では精度 99 %、ハードウェアの固定小数点演算では、精度 98 % を確認することが出来た。今回は、畳み込み層に”Vivado HLS の任意精度固定小数点データ型の飽和演算”でテストした演算後の値を飽和演算し、また全結合層では内積の演算に飽和演算を用いる実装と、今まで通りにすべての演算に飽和演算を用いない場合について検証してみよう。

まずは、今まで通りに飽和演算を用いない場合について現在のパラメータで実力を確認しよう。
現在のMNIST のデータ数は 500 個を使用してる。
固定小数点のビット長のパラメータを次に示す。

#define INPUT_CHANNELS 1
#define INPUT_BIT_LENGTH 9
#define INPUT_INTEGER_LEN 1

#define CONV_BIT_LENGTH 10
#define CONV_INTEGER_LEN 3
#define CONV_CHANNELS 10

#define AFFINE_BIT_LENGTH 13
#define AFFINE_INTEGER_LEN 7

#define OUTPUT_BIT_LENGTH 12
#define OUTPUT_INTEGER_LEN 7


入力層の出力のビット長は 9 ビットで、そのうちの 1 ビットが整数のビット長である。つまり +1-0.00390625 〜 -1 までだ。
畳み込み層の出力のビット長は 10 ビットで、そのうちの 3 ビットが整数のビット長である。
全結合層の出力のビット数は 13 ビットで、そのうちの 7 ビットが整数のビット長である。
C シミュレーションの結果を示す。
tensorflow_keras_68_180609.png

500 個のMNIST データに対して、ソフトウェアのfloat 演算は 7 個、ハードウェアの固定小数点演算は 12 個のエラーが出た。
精度を計算してみよう。
ソフトウェアのfloat 演算のエラー数は 3 個なので、 (500 - 7) / 500 x 100 = 98.6 %
ハードウェアの固定小数点演算は 6 個なので、 (500 - 12) / 500 x 100 = 97.6 %
ソフトウェアのfloat 演算とハードウェアの固定小数点演算との差は 1 % となった。

さて、ここから、飽和演算をする実装に変更した mnist_conv10_hlss_k プロジェクトと今までの飽和演算をしない実装の mnist_conv10_hlss_k_org プロジェクトを比較してみよう。

飽和演算をする実装に変更した mnist_conv10_hlss_k プロジェクトの畳み込み層の飽和演算を紹介しよう。
tensorflow_keras_70_180610.png

演算結果の val を飽和演算して out_sat に代入する。 out_sat を conv_out.data[k] に代入している。

次に、mnist_conv10_hlss_k プロジェクトの飽和演算を紹介する。
tensorflow_keras_71_180610.png

飽和演算するように宣言した dot配列を使用して演算するので、飽和演算が実行できる。

さて、今までのKeras パラメータを見ると、第1層目の全結合層の値域が小さいので、整数値のビット長の 7 ビットはいらないことが分かった。そこで 5 ビットとする。そして、精度方向に 3 ビット拡張することにした。整数部を 2 ビット削除して、小数部を 3 ビット追加した。つまり、ビット長を 14 ビット、整数部のビット長を 5 ビットとした。
変更した固定小数点のビット長のパラメータを示す。

#define INPUT_CHANNELS 1
#define INPUT_BIT_LENGTH 9
#define INPUT_INTEGER_LEN 1

#define CONV_BIT_LENGTH 10
#define CONV_INTEGER_LEN 3
#define CONV_CHANNELS 10
#define CONV_MID_BIT_LENGTH 16
#define CONV_MID_BIT_INTGER_LEN 3

#define AFFINE_BIT_LENGTH 14
#define AFFINE_INTEGER_LEN 5
//#define AFFINE_BIT_LENGTH 13
//#define AFFINE_INTEGER_LEN 7

#define OUTPUT_BIT_LENGTH 12
#define OUTPUT_INTEGER_LEN 7


このパラメータでMNIST データ数を 1000 個として C シミュレーションを行った。
tensorflow_keras_69_180610.png

飽和演算をする実装に変更した mnist_conv10_hlss_k プロジェクトと今までの飽和演算をしない実装の mnist_conv10_hlss_k_org プロジェクト共に、1000 個のMNIST データに対して、ソフトウェアのfloat 演算は 15 個、ハードウェアの固定小数点演算は 15 個のエラーが出た。
という訳で、ソフトウェアのfloat 演算とハードウェアの固定小数点演算のエラー個数が同一になった。

次に、

#define AFFINE_BIT_LENGTH 13

に変更して、全結合層の演算のビット長を 13 ビットにした。 C シミュレーションの結果を示す。
tensorflow_keras_72_180610.png

飽和演算をする実装に変更した mnist_conv10_hlss_k プロジェクトと今までの飽和演算をしない実装の mnist_conv10_hlss_k_org プロジェクト共に、1000 個のMNIST データに対して、ソフトウェアのfloat 演算は 15 個、ハードウェアの固定小数点演算は 14 個のエラーが出た。
全結合層第1層目の演算のビット幅を 1 ビット減らしたのに、ハードウェアの固定小数点演算での精度が増えてしまった。良い具合に間違ったようだ。
現在のソフトウェアのfloat 演算の精度は 98.5 % だった。
  1. 2018年06月10日 05:03 |
  2. TensorFlow, Keras
  3. | トラックバック:0
  4. | コメント:0