PHP による機械学習

3,496 views

Published on

Attempt to use Neural Network using FANN module.

Published in: Technology

PHP による機械学習

  1. 1. PHP による機械学習 FANNを用いたニューラルネットワークの利用 Takayuki Hirai @pjxiao 2014/07/28
  2. 2. 注意事項(予防線) ● LT 初めてです(重要) ● ニューラルネットワークについてまるで詳しくないです
  3. 3. 注意事項 あと最近出たこの本とは関係ないです
  4. 4. 今日話すこと ● FANN モジュールのインストール ● FANN による関数近似 ● FANN による文字識別(失敗)
  5. 5. 今日話さないこと ● ニューラルネットワークが何かについて(話せません)
  6. 6. ニューラルネットワークとは(ざっくり) 1 2 3 4 5 これは “1” これは “2” これは “3” これは “4” これは “5” http://commons.wikimedia.org/wiki/File:Brain_logo.svg 学習させる
  7. 7. ニューラルネットワークとは(ざっくり) http://commons.wikimedia.org/wiki/File:Brain_logo.svg 教師あり学習 1 2 3 4 5 これは “1” これは “2” これは “3” これは “4” これは “5” 教師データ
  8. 8. ニューラルネットワークとは(ざっくり) これなに 0.055 くらい "1" っぽい -0.055 くらい "2" っぽい 0.889 くらい "3" っぽい -0.009 くらい "4" っぽい 0.075 くらい "5" っぽい 3 “3” かな
  9. 9. FANN とは ● FANN (Fast Artificial Neural Network) ● 多階層人工ニューラルネットワークを実装した FANN ライブラリの PHP バインディング。 ● 相互結合型と疎結合型両ネットワークをサポート。 ● 教師データを簡単に扱うためのフレームワークも含む。 ● 使いやすく、多目的で、ドキュメントが整備されていて、しかも速い。 ● ってドキュメント (http://php.net/manual/ja/intro.fann.php) に書いてあった。 ● そういえば、 SVM (http://php.net/manual/ja/book.svm.php) も PHP から使えます。 PHP からニューラルネットワークを使えるようにしたモジュール
  10. 10. FANN モジュールのインストール Ubuntu 14.04 へのインストール # apt-get install -y php5 php5-dev pkg-php-tools libfann-dev # pecl install fann # echo 'extension=fann.so' > /etc/php5/cli/conf.d/fann.ini
  11. 11. FANN による関数近似 教師データの生成(正弦関数) $ds = []; for ($x = 0; $x <= 6.28; $x += 0.01) // 2 * pi ~ 6.28 { $y = sin($x); $ds[] = [$x, $y]; }
  12. 12. FANN による関数近似 ニューラルネットワークの生成 // 各レイヤが持つニューロンの数 $LAYERS = [1, 10, 20, 1]; // ニューラルネットワークの生成 $ann = fann_create_standard_array(count($LAYERS), $LAYERS); // 活性化関数として tanh 関数を利用 fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC); fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);
  13. 13. FANN による関数近似 tanh 関数
  14. 14. FANN による関数近似 バックプロパゲーションによる学習 // 学習回数 $cnt = 2000; foreach (xrange($cnt) as $_) { foreach ($ds as list($x, $y)) { fann_train($ann, [$x], [$y]); } }
  15. 15. FANN による関数近似 学習結果の出力 $outputs = []; foreach ($ds as list($x, $y)) { $outputs[] = fann_run($ann, [$x])[0]; }
  16. 16. デモ
  17. 17. FANN による文字識別(失敗) GDでデータ生成
  18. 18. FANN による文字識別(失敗) 特徴ベクトルの作成 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 0 0 ※実際の OCR などで使われる特徴ベクトルとは異なります 元画像 二値化 行列化
  19. 19. FANN による文字識別(失敗) ● 関数近似とほぼ同じなのでコードは省略 ● 関数近似の際と同様にニューラルネットワークへ学習させる ● fann_save() 関数でニューラルネットワークの設定と学習結果(重み)を保存する
  20. 20. FANN による文字識別(失敗) 文字識別 // 設定と学習結果を読み込み $ann = fann_create_from_file('fann.conf'); // 引数から画像のロード $image = imagecreatefrompng($argv[1]); $size = getimagesize($argv[1]); // 特徴ベクトルの生成 $feature = []; foreach (product([range($size[0]), range($size[1])]) as list($x, $y)) { $feature[] = (imagecolorat($image, $x, $y) > 0) ? 1 : 0; }
  21. 21. FANN による文字識別(失敗) 文字識別 // 文字判定 $output = fann_run($ann, $feature); // 最大値選択 $result = array_keys($output, max($output))[0];
  22. 22. FANN による文字識別(失敗) 文字識別 $ php detect_char.php 1.png # 1 の画像を識別する 1 $ php detect_char.php 5.png # 5 の画像を識別する 5 $ ls detect_char.php 1.png 2.png 3.png 4.png 5.png $ php detect_char.php 1.png # 1 の画像を識別する 1 $ php detect_char.php 5.png # 5 の画像を識別する 5
  23. 23. FANN による文字識別(失敗) 備考 ● 教師データの生成元は? ○ Google Fonts から 20 種類ほど選んで生成した。 ● どれくらい判定できたの? ○ すべてのフォントについて学習させれば、ほぼ 100% 判定できた。 ○ 半分のフォントを教師データに、半分のフォントを評価用データに使うと、 60% 以上判定に失敗した。
  24. 24. FANN を使うメリット ● みんな大好き PHP が使える
  25. 25. FANN を使うデメリット ● ドキュメントが翻訳されていない。 ● ドキュメントの例くらいしか使用事例が見つからない。 ● 普通に Python (PyBrain) の方が楽。
  26. 26. まとめ Python でやろう
  27. 27. 参考資料等 ● http://anopara.matrix.jp/2014/01/11/pybrain%E3%81%A7sin%E9%96%A2%E6%95%B0%E3%82%92% E5%AD%A6%E7%BF%92%E3%81%95%E3%81%9B%E3%82%8B%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB/ ● http://php.net/manual/ja/book.fann.php ● http://docs.python.jp/2/library/itertools.html ● https://www.google.com/fonts

×