php による機械学習
TRANSCRIPT
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.svg
学習させる
ニューラルネットワークとは(ざっくり)
http://commons.wikimedia.org/wiki/File:Brain_logo.svg
教師あり学習
1
2
3
4
5
これは “1”
これは “2”
これは “3”
これは “4”
これは “5”
教師データ
ニューラルネットワークとは(ざっくり)
これなに
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 バインディング。
● 相互結合型と疎結合型両ネットワークをサポート。
● 教師データを簡単に扱うためのフレームワークも含む。
● 使いやすく、多目的で、ドキュメントが整備されていて、しかも速い。
● ってドキュメント (http://php.net/manual/ja/intro.fann.php) に書いてあった。
● そういえば、 SVM (http://php.net/manual/ja/book.svm.php) も PHP から使えます。
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
FANN による関数近似
教師データの生成(正弦関数)
$ds = [];for ($x = 0; $x <= 6.28; $x += 0.01) // 2 * pi ~ 6.28{ $y = sin($x); $ds[] = [$x, $y];}
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);
FANN による関数近似
tanh 関数
FANN による関数近似
バックプロパゲーションによる学習
// 学習回数
$cnt = 2000;foreach (xrange($cnt) as $_){ foreach ($ds as list($x, $y)) { fann_train($ann, [$x], [$y]); }}
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 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 などで使われる特徴ベクトルとは異なります
元画像 二値化 行列化
FANN による文字識別(失敗)
● 関数近似とほぼ同じなのでコードは省略
● 関数近似の際と同様にニューラルネットワークへ学習させる
● fann_save() 関数でニューラルネットワークの設定と学習結果(重み)を保存する
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;}
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
$ 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
FANN による文字識別(失敗)
備考
● 教師データの生成元は?
○ Google Fonts から 20 種類ほど選んで生成した。
● どれくらい判定できたの?
○ すべてのフォントについて学習させれば、ほぼ 100% 判定できた。
○ 半分のフォントを教師データに、半分のフォントを評価用データに使うと、
60% 以上判定に失敗した。
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%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