FC2カウンター FPGAの部屋 TensorFlow + Kerasを使ってみた12(MNISTのデータの一部をC のヘッダに変換)

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

FPGAの部屋

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

TensorFlow + Kerasを使ってみた12(MNISTのデータの一部をC のヘッダに変換)

TensorFlow + Kerasを使ってみた11(全結合層の重みをC のヘッダに変換)”の続き。

前回は全結合層1層目、2層目の重みをC のヘッダに変換した。今回は、MNISTのデータの一部をC のヘッダに変換してみよう。これは、Vivado HLS のC シミュレーション時に精度を確認するためのデータとなる。

MNISTのデータの一部をC のヘッダに変換するPython コードを示す。
(2018/06/05:修正 MNIST のデータを見ると 1.0 つまり 256 のデータが存在する。これは 8 ビット長のビット表現では、 0 になってしまうことが考えられるので、Python コードを修正した)

# MNISTのデータをCの配列に出力し、ファイルに書き込み

# coding: utf-8
import sys, os
sys.path.append(os.pardir)

import numpy as np
import datetime

OUTPUT_DATA_NUM = 300 # 出力するMNISTのテストデータ数 10000までの数
OFFSET = 0 # MNISTデータセットのオフセット、100だったら100番目からOUTPUT_DATA_NUM個を出力する

# データの読み込み
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 256
x_test /= 256

print(x_test.shape)

f = open("mnist_data.h", 'w')
todaytime = datetime.datetime.today()
f.write('// mnist_data.h\n')
strdtime = todaytime.strftime("%Y/%m/%d %H:%M:%S")
f.write('// {0} by marsee\n'.format(strdtime))
f.write("\n")

f.write('ap_ufixed<8, 0, AP_TRN, AP_WRAP> x_test['+str(OUTPUT_DATA_NUM)+']['+str(x_test.shape[1]*x_test.shape[2])+'] = {\n')
for i in range(OFFSET, OFFSET+OUTPUT_DATA_NUM):
    f.write("\t{")
    for j in range(x_test.shape[1]):
        for k in range(x_test.shape[2]):
            if (x_test[i][j][k] == 1.0):
                x_test[i][j][k] = x_test[i][j][k] * 256
                x_test[i][j][k] = (x_test[i][j][k]-1)/256
            f.write(str(x_test[i][j][k]))
            if (j==x_test.shape[1]-1 and k==x_test.shape[2]-1):
                if (i==OFFSET+OUTPUT_DATA_NUM-1):
                    f.write("}\n")
                else:
                    f.write("},\n")
            else:
                f.write(", ")
f.write("};\n")

f.write('int x_test_256['+str(OUTPUT_DATA_NUM)+']['+str(x_test.shape[1]*x_test.shape[2])+'] = {\n')
for i in range(OFFSET, OFFSET+OUTPUT_DATA_NUM):
    f.write("\t{")
    for j in range(x_test.shape[1]):
        for k in range(x_test.shape[2]):
            f.write(str(int(x_test[i][j][k]*256)))
            if (j==x_test.shape[1]-1 and k==x_test.shape[2]-1):
                if (i==OFFSET+OUTPUT_DATA_NUM-1):
                    f.write("}\n")
                else:
                    f.write("},\n")
            else:
                f.write(", ")
f.write("};\n")

f.write("\n")
f.write('int y_test['+str(OUTPUT_DATA_NUM)+'] = {\n')
for i in range(OFFSET, OFFSET+OUTPUT_DATA_NUM):
    f.write(str(y_test[i]))
    if (i==OFFSET+OUTPUT_DATA_NUM-1):
        f.write("};\n")
    else:
        f.write(", ")
        
f.close() 


このPython コードを実行すると mnist_data.h が生成される。
mnist_data.h の一部を示す。
tensorflow_keras_55_180604.png
tensorflow_keras_56_180604.png
tensorflow_keras_57_180604.png

出力されたMNIST のデータが正しいかどうか?を確かめてみた。
x_test256[300][784] のデータをLibreOffice Calc で 28 x 28 に並べみた。
tensorflow_keras_58_180605.png

少しデータが余ってしまったが、7 に見える。
y_test[300] を見ても、最初の数は 7 なので、mnist_data.h は正しいようだ。
  1. 2018年06月04日 05:26 |
  2. TensorFlow, Keras
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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