2017年6月27日火曜日

tiny-dnnでディープラーニングしてみた。

おじさんWindowsとC++言語大好きなのですが、なかなかWindowsのC++言語で動くディープラーニングのライブラリってないんですよね。

ディープラーニングは無理かなと思っていたのですが、C++で簡単に使えるtiny-dnnという深層ニューラルネットワークのライブラリがあることがわかったので、遊んでみました。

最近のC++のライブラリの流れとして、ヘッダーファイルだけ取ってくればインストールなしで使えるものが多いですね。
Pythonと競争しているのか、Pythonを使う上でめんどくさいライブラリーをインストールする作業をしないで使えるというのはよいですね。ライブラリをインストールすると起きるバージョン問題とか起きないし。


ということでtiny-dnnをGitHubから取ってきます。
https://github.com/tiny-dnn/tiny-dnn

このライブラリの作者は日本人のようで、日本人でこんなの作れるなんてすごいですね。最初tiny-dnnのマスターの最新を取ってきたのですが、これだと、なぜかMacやVisualStudio2013でビルドできません。

しょーがねーなー。
というとこでv1.0.0.a3のタグのものを取ってきます。


なにかデモでも動かしてみようと。
tiny-dnnのソースを展開するとexamplesディレクトリにおなじみの文字認識mnist
があるので、それを動かしてみます。

ministディレクトリにTest.cppがあるのでg++やVisualStudioで

g++ -I../.. Test.cpp

のように簡単にコンパイルして実行できます。
とっても簡単。

  nn << convolutional_layer(32, 32, 5, 1, 6,   // C1, 1@32x32-in, 6@28x28-out
                            padding::valid, true, 1, 1, backend_type)
     << tanh_layer()
     << average_pooling_layer(28, 28, 6, 2)    // S2, 6@28x28-in, 6@14x14-out
     << tanh_layer()
     << convolutional_layer(14, 14, 5, 6, 16,  // C3, 6@14x14-in, 16@10x10-out
                            connection_table(tbl, 6, 16),
                            padding::valid, true, 1, 1, backend_type)
     << tanh_layer()
     << average_pooling_layer(10, 10, 16, 2)   // S4, 16@10x10-in, 16@5x5-out
     << tanh_layer()
     << convolutional_layer(5, 5, 5, 16, 120,  // C5, 16@5x5-in, 120@1x1-out
                            padding::valid, true, 1, 1, backend_type)
     << tanh_layer()
     << fully_connected_layer(120, 10, true,   // F6, 120-in, 10-out
                              backend_type)
     << tanh_layer();


こんな風に「<<」演算子で連結すると深層ニューラルネットワークが組めるのも面白いですね。

Test.cppをコンパイルして実行してみてわかったのですが、学習したデータがないよ。
作者のホームページ上で公開している学習済みデータは違うものだし。


しょーがーねーなー。
ということでTrain.cppを同じようにコンパイルして学習プログラム動かします。

Train.exe ../../data

これで学習するようです。
とりあえず学習開始。
最適化をしないで普通にコンパイルをかけて実行したら、1エポック実行するのに2時間くらいかかるようです。
冗談じゃない。明日までかかるじゃないか。

なのでコンパイル時の最適化をマックスにしてもう一度再コンパイルして実行。
一回実行するのに2分くらいになりました。

これならエポック値30で1時間。
とりあえずしばらく放置します。
ファンがマックスで回りますが一時間くらいするとLeNet-modelというファイルができます。
おじさんせっかちなんだよね。なんで機械学習ってそんなに時間かかるんだ。
でもこれで、文字認識をすることができる。

Test.exe hati.png

と指定して「8」の文字を認識させてみました。


3,41.5217
8,40.3152
2,23.789


なんと、「3」という結果に。
おじさん字を書くの汚いし、確かに「3」と「8」にてるからなぁ。
やっぱ、一時間くらいの学習では文字は認識できないらしいです。


0 件のコメント:

コメントを投稿