php による機械学習

27
PHP による機械学習 FANNを用いたニューラルネットワークの利用 Takayuki Hirai @pjxiao 2014/07/28

Upload: xiao-hirai

Post on 11-Jul-2015

934 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: PHP による機械学習

PHP による機械学習

FANNを用いたニューラルネットワークの利用

Takayuki Hirai@pjxiao

2014/07/28

Page 2: PHP による機械学習

注意事項(予防線)

● LT 初めてです(重要)

● ニューラルネットワークについてまるで詳しくないです

Page 3: PHP による機械学習

注意事項

あと最近出たこの本とは関係ないです

Page 4: PHP による機械学習

今日話すこと

● FANN モジュールのインストール

● FANN による関数近似

● FANN による文字識別(失敗)

Page 5: PHP による機械学習

今日話さないこと

● ニューラルネットワークが何かについて(話せません)

Page 6: PHP による機械学習

ニューラルネットワークとは(ざっくり)

1

2

3

4

5

これは “1”

これは “2”

これは “3”

これは “4”

これは “5”

http://commons.wikimedia.org/wiki/File:Brain_logo.svg

学習させる

Page 7: PHP による機械学習

ニューラルネットワークとは(ざっくり)

http://commons.wikimedia.org/wiki/File:Brain_logo.svg

教師あり学習

1

2

3

4

5

これは “1”

これは “2”

これは “3”

これは “4”

これは “5”

教師データ

Page 8: PHP による機械学習

ニューラルネットワークとは(ざっくり)

これなに

0.055 くらい "1" っぽい

-0.055 くらい "2" っぽい

0.889 くらい "3" っぽい

-0.009 くらい "4" っぽい

0.075 くらい "5" っぽい

3

“3” かな

Page 9: PHP による機械学習

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 からニューラルネットワークを使えるようにしたモジュール

Page 10: PHP による機械学習

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

Page 11: PHP による機械学習

FANN による関数近似

教師データの生成(正弦関数)

$ds = [];for ($x = 0; $x <= 6.28; $x += 0.01) // 2 * pi ~ 6.28{ $y = sin($x); $ds[] = [$x, $y];}

Page 12: PHP による機械学習

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);

Page 13: PHP による機械学習

FANN による関数近似

tanh 関数

Page 14: PHP による機械学習

FANN による関数近似

バックプロパゲーションによる学習

// 学習回数

$cnt = 2000;foreach (xrange($cnt) as $_){ foreach ($ds as list($x, $y)) { fann_train($ann, [$x], [$y]); }}

Page 15: PHP による機械学習

FANN による関数近似

学習結果の出力

$outputs = [];foreach ($ds as list($x, $y)){ $outputs[] = fann_run($ann, [$x])[0];}

Page 17: PHP による機械学習

FANN による文字識別(失敗)

GDでデータ生成

Page 18: PHP による機械学習

FANN による文字識別(失敗)

特徴ベクトルの作成

0 0 0 0 1 1 1 0 0 0 00 0 1 1 1 1 1 0 0 0 00 0 1 1 1 1 1 0 0 0 00 0 0 0 1 1 1 0 0 0 00 0 0 0 1 1 1 0 0 0 00 0 0 0 1 1 1 0 0 0 00 0 0 0 1 1 1 0 0 0 00 0 1 1 1 1 1 1 1 0 00 0 1 1 1 1 1 1 1 0 0

※実際の OCR などで使われる特徴ベクトルとは異なります

元画像 二値化 行列化

Page 19: PHP による機械学習

FANN による文字識別(失敗)

● 関数近似とほぼ同じなのでコードは省略

● 関数近似の際と同様にニューラルネットワークへ学習させる

● fann_save() 関数でニューラルネットワークの設定と学習結果(重み)を保存する

Page 20: PHP による機械学習

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;}

Page 21: PHP による機械学習

FANN による文字識別(失敗)

文字識別

// 文字判定

$output = fann_run($ann, $feature);

// 最大値選択

$result = array_keys($output, max($output))[0];

Page 22: PHP による機械学習

FANN による文字識別(失敗)

文字識別

$ php detect_char.php 1.png # 1 の画像を識別する

1$ php detect_char.php 5.png # 5 の画像を識別する

5

$ lsdetect_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

Page 23: PHP による機械学習

FANN による文字識別(失敗)

備考

● 教師データの生成元は?

○ Google Fonts から 20 種類ほど選んで生成した。

● どれくらい判定できたの?

○ すべてのフォントについて学習させれば、ほぼ 100% 判定できた。

○ 半分のフォントを教師データに、半分のフォントを評価用データに使うと、

60% 以上判定に失敗した。

Page 24: PHP による機械学習

FANN を使うメリット

● みんな大好き PHP が使える

Page 25: PHP による機械学習

FANN を使うデメリット

● ドキュメントが翻訳されていない。

● ドキュメントの例くらいしか使用事例が見つからない。

● 普通に Python (PyBrain) の方が楽。

Page 26: PHP による機械学習

まとめ

Python でやろう