FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

ニューラルネットワーク C/C++実装の検討(3. 学習済みデータでのネットワーク確認)

ニューラルネットワークを1からC/C++で記述してMNISTを実行してみるプロジェクト、なかなかうまく行かない。

学習のフェーズはとりあえず置いておいて、学習済みのパラメータを使ってネットワークに初期値を入力し、どのように計算されるかチェックしている。

トレーニング済みの重みをPythonコードから吸出し、それを入力してC/C++側プログラムの重みとして設定し、その上で学習を実行してみるわけだ。

上記のMNISTのコードと同じニューラルネットを構成し、そこにPythonから抜き出したネットワークの重み情報を入力して学習させてみる。 考え方はmarseeさんのネットワークのハードウェア化と一緒だ。

FPGAの部屋 「ゼロから作るDeep Learning」の畳み込みニューラルネットワークのハードウェア化3

私の方では、以下のようにしてネットワーク中の重みを引き出した。

grad_w1_fp = open('grad_w1.h', 'w')
for y_idx in range(grad['W1'].shape[0]):
    for x_idx in range (grad['W1'].shape[1]):
        grad_w1_fp.write ("{0:.10f} ".format(grad['W1'][y_idx][x_idx]))
    grad_w1_fp.write ("\n")
grad_w1_fp.close()

grad_b1_fp = open('grad_b1.h', 'w')
for x_idx in range (grad['b1'].shape[0]):
    grad_b1_fp.write ("{0:.10f} ".format(grad['b1'][x_idx]))
grad_b1_fp.close()

grad_w2_fp = open('grad_w2.h', 'w')
for y_idx in range(grad['W2'].shape[0]):
    for x_idx in range (grad['W2'].shape[1]):
        grad_w2_fp.write ("{0:.10f} ".format(grad['W1'][y_idx][x_idx]))
    grad_w2_fp.write ("\n")
grad_w2_fp.close()

grad_b2_fp = open('grad_b2.h', 'w')
for x_idx in range (grad['b2'].shape[0]):
    grad_b2_fp.write ("{0:.10f} ".format(grad['b2'][x_idx]))
grad_b2_fp.close()

完成したネットワークに対してデータを入力し、テストしているのだが、まだ正しく数字を認識してくれない。。。

引き続きデバッグ中。。。

f:id:msyksphinz:20170627012853p:plain