再構成可能なハードウェア(FPGAなど)を使用した高速化に適した計算的に広範なアプリケーションの例として、畳み込みニューラルネットワーク(CNN)に興味があります。
そのためには、実装方法、各レイヤーでの計算の実行方法、各レイヤーの出力が次のレイヤーの入力に供給される方法を理解するために使用できる単純なCNNコードを調べる必要があります。私は理論的な部分に精通しています( http://cs231n.github.io/convolutional-networks/ )
しかし、私はCNNのトレーニングには興味がありません。事前にトレーニングされ、すべての重みとバイアス値がわかっている完全な自己完結型のCNNコードが必要です。
私はCNNライブラリ、すなわちCaffeがたくさんあることを知っていますが、問題は自己完結した簡単なサンプルコードがないことです。最も単純なCaffeの例「cpp_classification」でも多くのライブラリが呼び出され、CNNのアーキテクチャは.prototxtファイルとして表され、.caffemodelや.binaryprotoなどの他のタイプの入力が含まれます。 openCV2ライブラリも呼び出されます。抽象化の層と層があり、異なるライブラリが連携して分類結果を生成します。
「使用可能な」CNN実装を生成するにはこれらの抽象化が必要であることを知っていますが、ハードボーンの人が勉強するために必要なコードを必要とする場合、これは「無関係な作業」です。
私の質問は次のとおりです:誰でも私を手始めにできるシンプルで自己完結型のCNN実装に導くことができますか?
tiny-cnn をお勧めします。シンプルで軽量(ヘッダーのみなど)、CPUのみであり、文献内で頻繁に使用されるいくつかのレイヤー(プーリングレイヤー、ドロップアウトレイヤー、ローカル応答正規化レイヤーなど)を提供します。つまり、CUDAの知識を必要とせずに、C++でこれらのレイヤーの効率的な実装を簡単に探索し、 Caffe などのフレームワークで必要なI/Oおよびフレームワークコードを掘り下げることができます。実装にはコメントがありませんが、コードはまだ読みやすく、理解しやすいです。
提供されている MNISTの例 は非常に使いやすく(しばらく前に試してみました)、効率的にトレーニングします。トレーニングとテストの後、重みがファイルに書き込まれます。次に、開始可能な単純な事前トレーニングモデルがあります。提供されている examples/mnist/test.cpp および examples/mnist/train.cpp を参照してください。テスト(または数字の認識)用に簡単にロードできるため、学習したモデルを実行しながらコードをデバッグできます。
より複雑なネットワークを調べたい場合は、 Cifar-10 Example をご覧ください。
これは私が見た中で最も単純な実装です: DNN McCaffrey
また、 Karpathyによるこれ のソースコードは非常に簡単に見えます。