Submit Search
Pythonとdeep learningで手書き文字認識
•
Download as PPTX, PDF
•
163 likes
•
199,342 views
Ken Morishita
Follow
この続きでTheanoの使い方について簡単に書きました:http://qiita.com/items/3fbf6af714c1f66f99e9
Read less
Read more
1 of 59
Download now
Downloaded 711 times
More Related Content
Pythonとdeep learningで手書き文字認識
1.
Pythonと Deep Learning 手書き文字認識
2012/12/17 株式会社ゆめみ mokemokechicken@twitter 1
2.
はじめに
2
3.
最近 ニューラルネットワーク
が熱い! 3
4.
ニューラルネットの逆襲 http://research.preferred.jp/2012/11/deep-learning/ Deep Learning!?
4
5.
ある人はこう表現していた
黒船!? 5 http://www.slideshare.net/takmin/building-highlevelfeatures より
6.
なんか 凄そうだぞ! Deep Learning!!
6
7.
うーん、、、 でも難しいんじゃないか?
7
8.
いや、意外とそうでもない!
8
9.
今回は 実用的 かつ
身近になった ニューラルネットワークのお話 です 9
10.
目次 •
機械学習の概要 • ニューラルネットワーク(NN)について • Deep Learning革命 • Deep LearningのPythonライブラリ • 手書き文字認識への応用 10
11.
機械学習の概要
11
12.
機械学習とNN • NNは機械学習の仕組みの一つ • 機械学習には「教師あり/教師なし」があ
る 12
13.
教師あり学習と教師なし学習 • 教師あり学習
NNはこっち – 「問題→答え」を当てる形式 – 入力と出力の関係を学習 – 入力から出力を予測する • 教師なし学習 – 「答えがない」形式 – 入力の特徴を抽出したり – データを分類したり 13
14.
機械学習が通常ロジックと異なる
点 • 「入力→■→出力」 なら関数と同じじゃな い? • 普通のプログラムや関数と何が違うの か? • 人間がルールを記述しない • 機械構造が同じでも「学習」に使うデー タで動作が変わる – 良いデータが集まると賢くなる(可能性があ 14 る)
15.
入力→出力 の例1 入力(X)
出力(Y) 数値 0 1 ? 2 0 3 1 4 5 6 7 仕様 8 0〜4------------------------------ 0 9 5〜9------------------------------ 1 単純すぎて機械学習の意味がない 15
16.
入力→出力 の例2
入力(X) 出力(Y) 電卓数値7箇所の光っているかどうか なんの数字を表しているか x0 0 x1 x2 1 ? x3 2 x4 x5 3 x6 4 5 6 7 8 9 X=(x0,x1,x2,x3,..,x6) (xk={0,1}) ちょっと悩むでしょ? でもまだ単純過ぎますね 16
17.
入力→出力 の例3
入力(X) 出力(Y) 28x28Pixelの手書き数字画像 なんの数字を表しているか 0 28 1 ? 28 2 3 4 5 6 7 8 X=(x0,x1,..,x783) (xk={0~1}) 9 もう普通のロジックでは書けないですね・・・ でも、NNならできるんです!(間違うこともある 17
18.
機械学習って何をしているの? • 学習機械の内部パラメータを更新してい
る 仕様 先ほどの例1 0〜4------------------------------ 0 5〜9------------------------------ 1 例えば 内部構造 Y=wX+c < 0 ? 0 : 1 とすると、wとcがパラメータ Y=2x-9 学習して、 w=2, c=-9 だと なんとなく良さげでしょ? 18
19.
どうやってパラメータ更新するの
か? • 機械学習の仕組みによって異なる • NNであれば 1. WやCを大小どちらに変化させると正解に近 づくか計算 2. ちょっとだけWやCを更新する 3. 繰り返し 19
20.
NN学習の流れ
NN君 2.内部パラメータ更新 学習 1.データを3つに分ける 4.繰り返す 3.当たるようになった? 元デー 検証 タ エラー率 3.23%です 5.最終テスト テスト 20
21.
なぜデータを分けるのか? • 学習データで高い評価が出ても「学習し
過ぎ」の可能性がある • 「過学習」と呼ばれる現象 • 過学習というのは細部を見過ぎて、一般 性を失っている状態 21
22.
過学習 • 例えば、男と女を見分けるのに –
「女性は名前が“明美”or“寛子”or“優子”or...であ る」 と覚えてしまうようなもの • 未知の類似データを正しく分類できなくなる – “明子”はもうよくわからない • 機械学習で本当にやりたいのは、画像の分類 などのように「未知の類似のものを扱う」こ となので、過学習は望ましくない 22
23.
ニューラルネットワークについ て
23
24.
ニューラルネットワーク概要 • ニューロンの構造を模しているから
「ニューラルネットワーク」 • 「ユニット」を入力→出力に繋いだ構造 入力(X) 出力(Y) ユニット 24
25.
NNのユニット
ユニット ユニットの出力=出力関数(x1*w1+x2*w2+..+xn*wn + C) 25 http://thinkit.co.jp/article/30/2/ から画像は複製
26.
よく使う「出力関数」 シグモイド関数 tanh 出力が「0〜1」とか「−1〜1」に収まる滑らかな曲線なのがポイント
26
27.
数学的には この構造はかなり表現力がある
らしい 27 ※ちゃんと学習できるならね
28.
DEEP LEARNING革命
28
29.
Deep Learning • Deep
Learning は、高性能なNNを実現する ための技術の総称みたいなもの (だと思う) • NNや機械学習における課題を解決してい る 29
30.
従来のNNの問題点 この層(レイヤー)の段数が多いほど「表現力は高い」
でも「学習」が難しかった 30
31.
なぜ学習が難しい?
内部パラメータ更新のために 出力→入力に向けて正解に近づくように調整するが・・・ 段数が多いと上手く情報が伝わらない 信号が上手く伝わらない、イメージらしい ノイズが多い伝言ゲームみたいな? 31
32.
じゃあ、準備しよう
適当なデータを入力して 教師なし学習です 変換・逆変換して元のデータになるように調整 変換F 1:X 2:F(X) 3:G(F(X)) 逆変換G X=G(F(X)) に近づくように調整する 32
33.
教師が来る前に自習する感じ?
変換F1 変換F2 1:X 2:F2(F1(X)) 3:G1(G2(F2(F1(X)))) 逆変換G1 逆変換G2 調整済みは固定 それをレイヤー毎に順次行なっていく こういうのを「Auto-Encoder」と呼ぶそうです 33
34.
Auto-Encoder • Auto-Encoderの更なる工夫の例 –
少ないパラメータで元の入力を再現するように制 約をかける – わざと多少ノイズを入れてしまう • すると2段目のレイヤーが特徴を表すように なる(!) • その後の教師付き学習でもよく学習できるよ うになる(!) 34
35.
機械学習全般の課題
基本的に、どういうデータ(特徴)を入力とするかで、精度が大きく変わる ここが 重要 でも、どういう特徴を入力とすれば良いかは、 人間の勘と経験に依存することが多い 35
36.
特徴の抽出もやってしまおう! こんな入力
特徴抽出 こんな感じになる なんかそれっぽい! Restricted Boltzmann Machines (RBM) という仕組み 36
37.
色々合わせ技でうまくやる! • 多段でも上手く学習 • 特徴を抽出したりす
る • 他にも色々技がある • すると精度が劇的 UP! • 柔軟に組み合わせら れるのもNNのメリッ でも、どういう構造がベストかは、問題に依存する トかも 37
38.
DEEP LEARNINGのPYTHONライブラ リ
38
39.
Theano •
て発音するらしいです http://www.clear-english.com/db/theano.html 調べ • 「てあーの」という説もあります http://ejje.weblio.jp/content/Theano 調べ • 発音がよくわかりませんw • Pythonのライブラリ • 数学表現を定義したり、高速計算が可能 • 多次元配列でも綺麗に表記できる • 数式計算をC言語に動的に変換して実行する • GPU(Graphic Processing Unit)に計算を行わせること もできる(数倍〜150倍くらい速い) • http://deeplearning.net/software/theano/ 39
40.
かっこいい Theanoの基本
>>> import theano.tensor as T >>> import theano xがベクトルとかでも>>> x = T.dscalar("x") ←Theanoの変数Object 行列とかでもOK >>> y = (x-1)**2 ←Theanoの式表現 >>> y Elemwise{pow,no_inplace}.0 ここで >>> f = theano.function([x], y) 関数f(x)=y=(x-1)**2 コンパイルが走る! >>> f(0) 関数f(0)=(0-1)**2=1 array(1.0) >>> f(1) 関数f(1)=(1-1)**2=0 array(0.0) 40
41.
かっこいいTheanoの自動微分
y=(x-1)**2 >>> z = T.grad(y, x) を x で微分する ↓ z=y’=2(x-1) >>> 式を関数にする fz = theano.function([x],z) fz(x)=z=2(x-1) >>> fz(0) fz(0)=2(0-1) = -2 array(-2.0) >>> fz(5) array(8.0) fz(5)=2(5-1) = 8 ※「自動微分」は微分された式表現を求める技術 ※値の代入で求める「数値微分」とは異なる(wikipedia) 41
42.
TheanoとNN • NNの計算は、行列計算や勾配の計算が主 • Theanoで簡潔に記述して高速に計算できる •
Deep LearningをTheanoでどう実装するかが Theanoのマニュアルにある(これ重要) • それを少し修正して今回使った – 内部パラメータのSaveとLoad – Classのメソッド名や引数を統一 42
43.
手書き文字認識への応用
43
44.
手書き文字認識 • オンライン文字認識 –
ペンの動きがわかって いる • オフライン文字認識 – 画像からのみ判断 今回は「数字(10文字)+ひらがな(71文字)」の識別に挑戦 44
45.
オンライン文字認識 • ペンの動き(ストローク)をデータとし
て使う • 上手くストロークを入力データ化できれ ば比較的簡単に良い精度の結果が得られ る – ちなみにTomoeという有名なOpenSourceもあ る • ポイントの一つはそのストローク変換に 45
46.
ストロークの変換 今回行った方法 • ストロークを上下左右4方向の移動量で
表現 x1 こんなストロークなら 0.5 X=(0.7,0.5, 0, 0) とする x2 x0 0.7 x3 46
47.
ストロークの変換 ストローク1
8 6 7 5 4 3 ストローク2 5,7は空中のストロークとして扱う 47
48.
入力データの形式 • ストロークの1直線が
「ペン接触(4) + 空中移動(4)」 の8要素のベクトル • 今回50直線分まで認識対象とした • つまり、入力は400要素のベクトル 48
49.
NNユニット構成 • 出力ユニット数は81個(全文字の数)
• 該当する文字のユニットの値が高くなる 「0」 ストローク 「1」 「ん」 400個 この部分は可変 81個 「隠れ層」と呼ぶ 49
50.
NNの構成と実験パターン • NNの構成 –
SdA: Auto-Encoderを使うパターン – RBM: RBMを使うパターン • NNユニット数の構成 – 隠れ1層: 400-100-81, 400-1000-81 – 隠れ2層: 400-100-100-81, – 隠れ3層: 400-100-100-100-81 • 筆跡データは、主に私の筆跡のみ(結果的 に) – なので、比較的認識しやすいはずです 50
51.
オンライン版結果 • 単純な構造(400-100-81)が良かった
– エラー1%程度 – 400-50-81 なども悪くなかった • RBMよりSdAの方が少し良かった • 400-1000-81, 400-100-100-81 はエラー多め 51
52.
オフライン文字認識 • ペンで書いた画像から文字を識別する • 入力データは大きさだけ枠に合わせた
– しないとかなり結果が悪い 52
53.
入力データの形式 今回行った方法 • 30x30ピクセルのGrayScale画像として
使った • つまり入力は900要素のベクトル – それぞれの値は0〜1 – 0か1でも良かったけど 53
54.
NNユニット構成 • 出力ユニット数は81個(全文字の数)
「0」 画素 「1」 「ん」 900個 この部分は可変 81個 54
55.
NNの構成と実験パターン • NNの構成(SdA,RBM) • NNユニット数の構成
– 隠れ1層: 400-100-81, 400-1000-81,400-3000- 81 – 隠れ2層: 400-100-100-81, – 隠れ3層: 400-100-100-100-81 • データもオンライン版と同じ 55
56.
オフライン版結果 • 900-100-100-100-81 や
900-100-100-81 が良い – エラー率15%程度 • 900-100-81, 900-1000-81, 900-3000-81などは エラーが多い • SdAよりRBMの方が少し良い結果 56
57.
考察 • 入力データによる違いはやはり大きい –
オンライン版の方が精度が良かった • 人間が上手く特徴量を抽出したと言える – オフライン版は、もう少し類似の変則的な データを学習すれば変わるのかもしれない • データによって学習精度の良い構造が違 う – いろいろ試すしかない(勘と経験) 57
58.
全体まとめ • Deep Learning
は今後も発展していくで しょう • Theanoのようなライブラリで、NNの中身 がよくわからなくても実装できますよ • 何か面白いネタがあれば作りたいです 58
59.
参考URL • 手書き文字認識デモ: 今回のデモが遊べます
– http://54.248.76.99:7777/ • 「ニューラルネットの逆襲」: 概要がよくわかります – http://research.preferred.jp/2012/11/deep-learning/ • Building High-level Features Using Large Scale Unsupervised Learning – http://www.slideshare.net/takmin/building-highlevelfeatures – すごさが伝わってきます • Deep learning勉強会20121214ochi – http://www.slideshare.net/alembert2000/deep-learning20121214ochi – Deep Learningの特徴とか。理論よりな話 59
Download