Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
PHP による機械学習
FANNを用いたニューラルネットワークの利用
Takayuki Hirai
@pjxiao
2014/07/28
注意事項(予防線)
● LT 初めてです(重要)
● ニューラルネットワークについてまるで詳しくないです
注意事項
あと最近出たこの本とは関係ないです
今日話すこと
● FANN モジュールのインストール
● FANN による関数近似
● FANN による文字識別(失敗)
今日話さないこと
● ニューラルネットワークが何かについて(話せません)
ニューラルネットワークとは(ざっくり)
1
2
3
4
5
これは “1”
これは “2”
これは “3”
これは “4”
これは “5”
http://commons.wikimedia.org/wiki/File:Brain_logo.sv...
ニューラルネットワークとは(ざっくり)
http://commons.wikimedia.org/wiki/File:Brain_logo.svg
教師あり学習
1
2
3
4
5
これは “1”
これは “2”
これは “3”
これは “4”...
ニューラルネットワークとは(ざっくり)
これなに
0.055 くらい "1" っぽい
-0.055 くらい "2" っぽい
0.889 くらい "3" っぽい
-0.009 くらい "4" っぽい
0.075 くらい "5" っぽい
3
“3”...
FANN とは
● FANN (Fast Artificial Neural Network)
● 多階層人工ニューラルネットワークを実装した FANN ライブラリの PHP バインディング。
● 相互結合型と疎結合型両ネットワークをサポート。...
FANN モジュールのインストール
Ubuntu 14.04 へのインストール
# apt-get install -y php5 php5-dev pkg-php-tools libfann-dev
# pecl install fann
#...
FANN による関数近似
教師データの生成(正弦関数)
$ds = [];
for ($x = 0; $x <= 6.28; $x += 0.01) // 2 * pi ~ 6.28
{
$y = sin($x);
$ds[] = [$x, $...
FANN による関数近似
ニューラルネットワークの生成
// 各レイヤが持つニューロンの数
$LAYERS = [1, 10, 20, 1];
// ニューラルネットワークの生成
$ann = fann_create_standard_arra...
FANN による関数近似
tanh 関数
FANN による関数近似
バックプロパゲーションによる学習
// 学習回数
$cnt = 2000;
foreach (xrange($cnt) as $_)
{
foreach ($ds as list($x, $y))
{
fann_tra...
FANN による関数近似
学習結果の出力
$outputs = [];
foreach ($ds as list($x, $y))
{
$outputs[] = fann_run($ann, [$x])[0];
}
デモ
FANN による文字識別(失敗)
GDでデータ生成
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...
FANN による文字識別(失敗)
● 関数近似とほぼ同じなのでコードは省略
● 関数近似の際と同様にニューラルネットワークへ学習させる
● fann_save() 関数でニューラルネットワークの設定と学習結果(重み)を保存する
FANN による文字識別(失敗)
文字識別
// 設定と学習結果を読み込み
$ann = fann_create_from_file('fann.conf');
// 引数から画像のロード
$image = imagecreatefrompng...
FANN による文字識別(失敗)
文字識別
// 文字判定
$output = fann_run($ann, $feature);
// 最大値選択
$result = array_keys($output, max($output))[0];
FANN による文字識別(失敗)
文字識別
$ php detect_char.php 1.png # 1 の画像を識別する
1
$ php detect_char.php 5.png # 5 の画像を識別する
5
$ ls
detect_ch...
FANN による文字識別(失敗)
備考
● 教師データの生成元は?
○ Google Fonts から 20 種類ほど選んで生成した。
● どれくらい判定できたの?
○ すべてのフォントについて学習させれば、ほぼ 100% 判定できた。
○ 半...
FANN を使うメリット
● みんな大好き PHP が使える
FANN を使うデメリット
● ドキュメントが翻訳されていない。
● ドキュメントの例くらいしか使用事例が見つからない。
● 普通に Python (PyBrain) の方が楽。
まとめ
Python でやろう
参考資料等
● 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%...
Upcoming SlideShare
Loading in …5
×

PHP による機械学習

4,256 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

×