C++
- google-test : http://opencv.jp/googletestdocs/primer.html
- protobuf : https://github.com/google/protobuf/tree/master/src
Python (重みやデータの生成用)
- numpy
- pickle
- scikit-learn
ALL
$ make -j4
MLP
$ make bin/mlp
$ ./bin/mlp test # 推論の場合
$ ./bin/mlp train # 学習の場合
CNN
$ make bin/cnn
$ ./bin/cnn test # 推論の場合
$ ./bin/cnn train # 学習の場合
テスト
$ make bin/utest
$ ./bin/utest
生成されたファイルの削除
$ make clean
※Stack Overflowした場合
$ ulimit -s 16384
- function.hpp : 活性化関数や畳込み、プーリングなど基本的な関数が実装されている
- tensor.hpp : 多次元配列を扱うTensorクラスを定義している
- read_data.cpp, read_data.hpp : MNISTのデータの読み込みをするクラス
- cnn.hpp : CNNクラスを定義している
- mlp.hpp : MLPクラスを定義している
- make_cnn_weight.py : cnnの重みを定義するcnn_weight.hppを生成するファイル
- make_mlp_weight.py : mlpの重みを定義するmlp_weight.hppを生成するファイル
- make_mnist_data.py : mnistのデータを定義するmnist_data.hppを生成するファイル
- make_test_array.py : テスト用の配列を定義するtest_array.hppを生成するファイル
- util_test.cpp : いろいろな関数のテストが実装されている
- std::vector, std::arrayはVivado HLSでサポートされていないので原則Tensorクラスか配列を使う
- malloc, freeを使わず、メモリ確保はtemplateを使うなどして静的に行う
- Vivado HLSでサポートされていないものを使うときはコメントを入れる
- templateを多様することになるため基本的に実装はすべてヘッダファイルに書くことになるはず
- 関数を実装したらテストを書く
- マージする前にテストが通っていることを確認する(CIとかと連携させてテストが通らないとマージできない設定にしたい...)
- pull requestはできるだけ細かくする
- branchも細かく切る
- コードレビューしてもらってからマージ
- スタイルはそんなに厳しく見ないけど、基本的にはhttps://ttsuki.github.io/styleguide/cppguide.ja.htmlに従う
- 基本的にメンバ変数はprivateにする
- 関数内で値が変更される場合はポインタで渡す
- 関数内で値が変更されない場合は参照渡しにする
- 型にできるだけ依存しないような実装をする
通常のプリントデバッグやデバッガでのデバッグに加えてValgrindを使うと効果的だったりする。
Valgrind
メモリリークとかをチェックしてくれるツール
日本語Wiki: https://ja.wikipedia.org/wiki/Valgrind
コマンド: 基本これだけ使っておけばなんとかなる
valgrind --leak-check=full ./a.out