FC2カウンター FPGAの部屋 白線間走行用CNNをKerasで学習する4(白線走行用テスト・データの一部をC のヘッダ・ファイルに変換)
FC2ブログ

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

FPGAの部屋

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

白線間走行用CNNをKerasで学習する4(白線走行用テスト・データの一部をC のヘッダ・ファイルに変換)

白線間走行用CNNをKerasで学習する3(各層の重みとバイアスをCのヘッダファイルに変換)”の続き。

前回は、重みやバイアスをPython コードを使用して C 言語のヘッダファイルに変換した。今回は、白線走行用テスト・データの一部をC のヘッダ・ファイルに変換する。

MNISTのデータの一部をC のヘッダファイルに変換するPython コードは前から作っていて、”TensorFlow + Kerasを使ってみた12(MNISTのデータの一部をC のヘッダに変換)”でもMNISTのデータの一部をC のヘッダ・ファイルに変換した。
今回は、白線走行用テスト・データなので、シャッフルされていないので、シャッフルしてから、1000個の白線走行用テスト・データをC ヘッダ・ファイルに変換する。やってみると、量子化した固定小数点数のメンバに、[] が付いてしまった。よって、[] を取り除くコードを追加した。

x_test_str = x_test_str[1:] # 文字列の内で最初の文字を削除
x_test_str = x_test_str[:-1] # 文字列の内で最後の文字を削除


Python コードを貼っておく。

# 白線走行用テスト・データをCの配列に出力し、ファイルに書き込み
# 2018/07/30 by marsee

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

import numpy as np
import datetime

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

# データの読み込み
(x_train, y_train), (x_test, y_test) = load_mnist(normalize=False, flatten=False)

# トレーニングデータとテストデータをシャッフル
trainzip = list(zip(y_train, x_train))
np.random.shuffle(trainzip)
y_train, x_train = zip(*trainzip)
x_train = np.asarray(x_train)
y_train = np.asarray(y_train)

testzip = list(zip(y_test, x_test))
np.random.shuffle(testzip)
y_test, x_test = zip(*testzip)
x_test = np.asarray(x_test)
y_test = np.asarray(y_test)

img_rows, img_cols = 10, 56
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 256
x_test /= 256

print(x_test.shape)

f = open("curve_line_data.h", 'w')
todaytime = datetime.datetime.today()
f.write('// curve_line_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
            x_test_str = str(x_test[i][j][k])
            x_test_str = x_test_str[1:]  # 文字列の内で最初の文字を削除
            x_test_str = x_test_str[:-1] # 文字列の内で最後の文字を削除
            f.write(x_test_str)
            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() 


出力された curve_line_data.h の一部を示す。
keras_mnist_zero_19_180730.png
  1. 2018年07月30日 04:45 |
  2. TensorFlow, Keras
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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