ニューラルネットワークを1からC/C++で記述してMNISTを実行してみるプロジェクト、なかなかうまく行かない。
学習のフェーズはとりあえず置いておいて、学習済みのパラメータを使ってネットワークに初期値を入力し、どのように計算されるかチェックしている。
トレーニング済みの重みをPythonコードから吸出し、それを入力してC/C++側プログラムの重みとして設定し、その上で学習を実行してみるわけだ。
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (16件) を見る
上記の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()
完成したネットワークに対してデータを入力し、テストしているのだが、まだ正しく数字を認識してくれない。。。
引き続きデバッグ中。。。