マルコフモデル,隠れマルコフモデルとコネクショニスト時系列分類法

with コメントはまだありません

マルコフモデル,隠れマルコフモデルとコネクショニスト時系列分類法についての資料。
EMアルゴリズムについて、HMMのパラメータの最尤推定について、コネクショニスト時系列分類法についてはもう少し詳しくこのブログで書けたらいいなって思ってます(願望)

参考

LSTMの解説(をしようと思った)

with コメントはまだありません

LSTMの解説をしようと思ったけど、なかなか重い腰があがらなかった。
なので、以前に輪講で使用した資料をそのまま貼り付けて記事にしようと思う。。。

間違っている点もあると思います。随時ご指摘願えたら嬉しいです。
他にも、不明な点などがありましたらいつでもコメント下さい。

ディープネットの事前学習・その他の自己符号化器

with コメントはまだありません

MLPシリーズ「深層学習」の5.6ディープネットの事前学習と5.7その他の自己符号化器のまとめです。

ディープネットの事前学習

多層の順伝播型ネットワークには勾配消失という現象が起こるため、学習が難しい。
これを解決するのが事前学習。

一般にネットワークの重みはランダムで初期化される。
この重みの初期値をもっと良いものにしておけば、勾配消失が起きないのでは?というアイデア
実際、経験則的に事前学習がうまくいくことが知られている。

勾配消失問題

勾配消失問題は何故起きるのか。

ニューラルネットワークの計算には順伝搬と逆転伝搬がある。
順伝搬は活性化関数を通すので出力は非線形になる。
非線形であれば、何層になっても出力が発散することはない。つまり勾配消失問題は起こらない。
一方、逆伝搬は線形計算である。
線形な計算を何度繰り返しても線形なので逆伝搬の誤差も線形計算である。
この時、各層の重みが大きいと、誤差が伝搬するうちに発散する、逆に重みが小さいと急速に消失し0になってしまう。
このため、重みの更新がうまくできない勾配消失問題が発生する。

積層自己符号化器

重みを事前に学習する方法として、積層自己符号化器というものがある。
以下のような多層の順伝播型ネットワークの重み,バイアスの初期値を積層型自己符号化器によって得る事を考える。
f:id:deeptoneworks:20161021133302p:plain

まず、上記の多層順伝播型ネットワークを層毎に分解し、それぞれを単一の自己符号化器とみなす。
f:id:deeptoneworks:20161021133512p:plain
それぞれを単一の自己符号化器とみなす、とは以下のような図の構成を意味する。
f:id:deeptoneworks:20161021133622p:plain
これらの自己符号化器の重みWnとバイアスbnをそれぞれ学習する。

最後に、上記の自己符号化器により得た重み,バイアスを初期値として多層順伝播型ネットワークの初期値とする。
ただし、最後にランダムに重みを初期化した層を1層追加する。
f:id:deeptoneworks:20161021133957p:plain
以上で、積層型自己符号化器による重み,バイアスの初期値の決定ができた。

その他の自己符号化器

多層自己符号化器

自己符号化器は基本的には一層であるが、これを多層にしたものを多層自己符号化器とよぶ。
f:id:deeptoneworks:20161021134254p:plain
f:id:deeptoneworks:20161021134310p:plain

デノイジング自己符号化器(雑音除去自己符号化器)

自己符号化器の入力,出力に確率的な考え方を追加した自己符号化器。
通常の自己符号化器より良い性能になることが知られている。

構築方法

ネットワークは通常の自己符号化器と全く同じであるが、 入力と出力(教師)のデータにノイズ(雑音)を加えたものを自己符号化器を構築する。
この自己符号化器の出力はノイズののったデータをx’とすると以下である。
f:id:deeptoneworks:20161021135042p:plain

そして、この出力と元のデータ(ノイズが乗っていないデータ)との差を誤差関数として学習する。
誤差関数は活性化関数が恒等写像であれば二乗誤差、
f:id:deeptoneworks:20161021134912p:plain

シグモイド関数であれば交差エントロピーなどを誤差関数として用いる。
f:id:deeptoneworks:20161021134925p:plain

ノイズの例

・ガウシアンノイズ
平均x,分散ρ2ガウス分布に従うノイズ

・マスク状のノイズ
適当な割合でランダムに要素を選択し、その値を0にする

・ソルト&ペッパーノイズ
適当な割合でランダムに要素を選択し、更にそこからランダムで上限値or下限値にする。
例えば、出力の上限,下限が1~0なら、50%の確率で1に,50%の確率で0にする。

データの白色化

with コメントはまだありません

MLPシリーズ「深層学習」の5.5節「データの白色化」についてのまとめです。

白色化とは?

成分間(データの特徴間)の相関をなくす処理のこと。
自己符号化器が良い特徴を学習できるかどうかを大きく左右することがある。

考え方

データxの任意の2成分間で相関がなくなる、ということは
つまり、共分散行列が対角行列になれば良い、ということ。

例えば、データxが3次元だとすれば、それらのデータ郡の分散共分散行列は下記のように表せる。

f:id:deeptoneworks:20161017152802p:plain

この中でσ13はデータx1とx3間の相関を表している。
これらの部分が0になれば(=対角行列であれば)成分間の相関がなくなった、といえる。

では、共分散行列を対角行列にするためには何を考えたら良いのかだが、
データxnがある線形変換Pによってun写像されるとし、
この変換後のunの共分散行列が対角行列になるようなPを考えると良いことになる。
f:id:deeptoneworks:20161017153613p:plain

線形変換Pの導出

まずは、「考え方」で示した部分を数式化しておく。

・データxの共分散行列
f:id:deeptoneworks:20161017155608p:plain
※各データの成分はそのデータの平均値を引いた処理を行っている(x – xとして処理済み)

・線形変換Pを施した後のデータun
f:id:deeptoneworks:20161017153613p:plain

・変換後のデータuの共分散行列
f:id:deeptoneworks:20161017155859p:plain

このΦU が対角行列に成ることが目標なのだが、ここで目標とする対角行列をI(=単位行列)とする。

すると、先の式はP=UXを用いて以下のように変形することができる。

f:id:deeptoneworks:20161017160933p:plain

※変形に
f:id:deeptoneworks:20161017161206p:plain,f:id:deeptoneworks:20161017161217p:plain
を用いている

そして、ΦX固有ベクトルの定義に従って次のように分解することができる。
f:id:deeptoneworks:20161017161752p:plain
固有ベクトルの定義)
f:id:deeptoneworks:20161020231606p:plain

ここで、EはΦX固有ベクトルを列ベクトルに持つ行列、Dは固有値を対角成分に持つ対角行列。

更に、Eが直交行列であることから、
f:id:deeptoneworks:20161018052705p:plain
と書ける。

これと、先の変形した式を用いると
f:id:deeptoneworks:20161017212508p:plain
とPを表すことができる。
(ここ、変形手順がわかりません・・・)

ただし、
・QはPと同じサイズの任意の直交行列
・D-1/2はDの対角成分を-1/2乗したもの

Qを定める

Qは任意に与えることができますが、以下の2つを与えることが多いようです。

PCA白色化

Qを単位行列にした時の線形変換P
f:id:deeptoneworks:20161017213234p:plain

共有分散行列の固有ベクトルを利用することから主成分分析に似ているため、PCA白色化とよぶ。

ZCA白色化

QをEにした時の線形変換P
Pが対称行列になっていることから、ゼロ位相白色化(ZCA白色化)とよぶ。
f:id:deeptoneworks:20161017220707p:plain

PCA白色化,ZCA白色化どちらの場合でも、データによっては特定の成分の分散が0かとても小さい(Dの対角成分のどこかが0,もしくはとても小さい)ことがある。
この場合、D-1/2を計算する際に問題になるので、とても小さい値ε(例えば10^-6など)をDに加える。
f:id:deeptoneworks:20161017221147p:plain

PCA白色化とZCA白色化の違い

以下はPCA白色化とZCA白色化の射影行列Pの行ベクトルを画像化したもの
(引用:dimensionality reduction – What is the difference between ZCA whitening and PCA whitening? – Cross Validated)

f:id:deeptoneworks:20161017224126p:plain

ZCA白色化ではフィルタ部分に相当する画素とその他の部分の画素の差を強調するようになっている。 (オンセンタと呼ばれる)
一方,PCA白色化では画像の高周波成分を強調するようになっている。元の画像の見た目とは全く違うものになる。

以下の画像をPCA白色化,ZCA白色化したものを示す。
f:id:deeptoneworks:20161017225917p:plain
(元画像)

f:id:deeptoneworks:20161017230128p:plain
(PCA白色化)

f:id:deeptoneworks:20161017230200p:plain
(ZCA白色化)

白色化の具体的な用途

基本的な機械学習アルゴリズムでは、白色化の有無によって結果が変わるようなものではない。
単位超球上に射影したデータの高密度方向を検出する場合のように、データの分布の方向のみが問題になる場合によく利用される。

更に,ZCA白色化が有効に機能する例はAEやCNNの前処理である。
ZCA白色化を施すことによってより局所的,鮮鋭的な特徴を学習することができる。
(多分)

(参考)
stats.stackexchange.com

補足

対角行列

対角成分以外が0の正方行列

共分散行列

対角成分に分散、それ以外の部分に共分散が並ぶ行列

直交行列

転置行列と逆行列が等しくなる正方行列。
MT M = M MT = Eが成り立つ。

固有値固有ベクトル

正方行列Aに対して
f:id:deeptoneworks:20161018033521p:plain
が成り立つ時xを固有ベクトル,λを固有値という
固有ベクトルはあるベクトルAを方向は変えず大きさだけ変えるような線形変換を施すベクトル。
固有値はその変換の倍率を表している。

ハイブリッドOCR

with コメントはまだありません

これまでの流れを汲んでOCRかけるクラスを完成させるで。
まだまだ改良の余地はあるけど、いつまでもこんなことばっかりやってられへんから一旦これでOCRは完結や。

流れは

1)白紙のセル判定 ->白紙なら終了
2)文字の部分だけ切り取る
3)tesseractにかける
4)数字ならそれで終了,数字以外ならvisionAPIにかける

簡単に実装するとこんな感じやで。

(input)
f:id:deeptoneworks:20160930050552p:plain
(output)
DetectText(kind=<CellKind.number: 3>, text=42.1)

(input)
f:id:deeptoneworks:20160930050600p:plain
(output)
DetectText(kind=<CellKind.string: 2>, text=’住宅の所有の関係(6区分)’)

(input)
f:id:deeptoneworks:20160930050606p:plain

(output)
DetectText(kind=<CellKind.empty: 1>, text=”)

ええ感じやな!次は素性作成器の実装や!

再びtesseractでOCR

with コメントはまだありません

前回、高解像度の綺麗なデータを作る事ができたんや。
せやったらtesseract、結構いけるんちゃうか?って話やで。

(1)
f:id:deeptoneworks:20160927110906p:plain

(2)
f:id:deeptoneworks:20160927111006p:plain

(3)
f:id:deeptoneworks:20160927111010p:plain

(4)
f:id:deeptoneworks:20160927111030p:plain

(5)
f:id:deeptoneworks:20160927111035p:plain

(6)
f:id:deeptoneworks:20160927111043p:plain

(7)
f:id:deeptoneworks:20160927111047p:plain

(8)
f:id:deeptoneworks:20160927111101p:plain

(9)
f:id:deeptoneworks:20160927111106p:plain

(10)
f:id:deeptoneworks:20160927111114p:plain

(11)
f:id:deeptoneworks:20160927111136p:plain

(12)
f:id:deeptoneworks:20160927111141p:plain

(13)
f:id:deeptoneworks:20160927111200p:plain

番号 解答 正負
(1) 持 ち 家 o
(2) ー 0 3 1 113 x
(3) ー 773 0 53 5 3 x
(4) 5 o
(5) 252 o
(6) 27 o
(7) 230 o
(8) 257 o
(9) 285 o
(10) 453 788 x
(11) 1 o
(12) 98 o
(13) 6 o

やっぱ日本語は微妙やな。
数字はええ感じや!このサイズやったら問題ないっぽいな。
ただ「,」が認識できとらん。
小数点は認識できるんやろか?試してみよか。

(1)
f:id:deeptoneworks:20160927123411p:plain
(2)
f:id:deeptoneworks:20160927123412p:plain
(3)
f:id:deeptoneworks:20160927123413p:plain
(4)
f:id:deeptoneworks:20160927123414p:plain
(5)
f:id:deeptoneworks:20160927123415p:plain
(6)
f:id:deeptoneworks:20160927123416p:plain
(7)
f:id:deeptoneworks:20160927123417p:plain
(8)
f:id:deeptoneworks:20160927123418p:plain
(9)
f:id:deeptoneworks:20160927123419p:plain
(10)
f:id:deeptoneworks:20160927123420p:plain

番号 解答 正負
(1) 2,990 o
(2) ー 906 x
(3) 31. 5 o
(4) 33. 4 o
(5) 23. 8 o
(6) 23. 3 o
(7) 34. 6 o
(8) 30. 2 o
(9) 22. 9 o
(10) 24. 6 o

小数点もとれるっぽいな!ええ感じやん。
ただ1個取れてないのがあるなあ。

・・・お、こんな感じで数字の部分だけ切り取ったらちゃんと読み込んだわ!
f:id:deeptoneworks:20160927125357p:plain

やっぱ数字の部分だけ切り取る処理を挟む必要がありそうやな。
さて、どう実装しよか。

凸包使うとかあるみたいやけど、数字は離れてるしなあ。
まあ、セルの一番左端と右端の白以外の画素の部分で切り取ったらええやろ!!
一応事前に2値画像に変えとるで!

こんなんでええか。2重ループ嫌やけど、flatにしたらあかんからな。
で、実際には20pxくらいマージンを入れて切り取ったらこんな感じなるで。

f:id:deeptoneworks:20160928052939p:plain

ええ感じやな! 次は日本語はgoogleVisionAPIに、数字はこっちのOCRで振り分ける処理を書いて実験しなな。

pdf->pngを変換を高画質に行いたい

with コメントはまだありません

初回あたりからずっと使ってる画質が粗いセルの画像やけど、そもそもpdf->png変換を高画質に出力できたらええんちゃうか?っていう話。
最初からこうしたらよかったんや、迷走しすぎやなあ。

さて、pdf->png変換を綺麗に行う為にはImageMagickを使うで。
convertコマンドに-densityオプションがあるんやけど、これで解像度を指定できるみたいや。
さっそくやってみよか。

出力は・・

・・・あかんやんけ!原因を探るで。

軽くググると、brewじゃなくてwebサイトからpkgをインストールしろとか、–build-from-sourceオプションつけてinstallしたら治るで!とか書いてあったわ。

ちなみにあかんかったで。書くまでもないような解決方法やってんけど、一応日本語ではないっぽいし書いとくわ。

解決方法はやっぱstackoverflowにのっとったわ。
superuser.com

gsに依存しとるんやなあ。installしとこ!

インストールしとったわ。 it’s just not linkedやて?ほなリンク貼っとこか。

よっしゃ!これで動くようになったで!!試すで!!

・・・

f:id:deeptoneworks:20160926200520p:plain

・・・!!

f:id:deeptoneworks:20160926200541p:plain

・・・!?!?

f:id:deeptoneworks:20160926200611p:plain

やばい!!めっちゃ綺麗や!!これは多分いけるで!!
というわけで次回はこれで数字認識を試してみるで!!!

(追記)
実際には背景透明化したくなかったのでalpha offオプションをつけています

めっちゃ粗い画像の数字を認識したい-試行錯誤編-

with コメントはまだありません

この画像↓を鮮鋭化するために試行錯誤するで。粗いなあ・・5か6かわからんで・・。
f:id:deeptoneworks:20160920003646p:plain
知り合いの人に色々なフィルタリング方法を教えてもらったんや。それをほぼそのまま貼るで。

アンシャープマスキング

f:id:deeptoneworks:20160920033250p:plain

ソーベルフィルタ

f:id:deeptoneworks:20160920034412p:plain

色々な2値化

f:id:deeptoneworks:20160920034752p:plain

ヒストグラム平滑化

f:id:deeptoneworks:20160920034916p:plain

モルフォロジー演算(収縮・膨張)

f:id:deeptoneworks:20160920035209p:plain

モルフォロジー演算、もっといい線いくと思ったんやけどなあ・・。あかんかったわ。
ヒストグラム平滑化は1つの数字の範囲を算出するのに使えそうや。自分で数字認識させるんやったらまず各数字の分離をせんとあかんからなあ。

Google Cloud Vision APIでOCRを試してみる

with コメントはまだありません

なんか前回か前々回か忘れたけど、日本語全然認識できひんかったから、Google様の力を借りるで・・。

毎月1000回以上のリクエストやったら無料や。
あ、正確には1000unitやな。例えば文字認識と物体認識を同時にやったら1リクエスト2unitsや。
1000unitsを超えたら1000units毎に2.5ドルとかするんや、たっかいなあ・・・。俺何万毎とOCRかけたいんやけどなあ・・。

使い方はめっちゃ簡単や!
Cloud Vision API Requests and Responses  |  Google Cloud Vision API Documentation  |  Google Cloud Platformソースコードも含めて全部書いてあるわ!!

ちなみに、特定の画像に対してリクエストを送ってレスポンスを受け取るのはこんな感じでできるで。

type:のところにTEXT_DETECTIONってしてるから文字認識やな。
他には顔認識とかランドマーク認識とかいろいろあるんやなあ。。。

さて、色々試していくで。
あ、その前にさっきのコードのまんまやったら、json形式のresponseがそのまま表示されて見にくいからちょっと修正せんとな。
responseのtextAnnotations->descriptionっていうとこに文字が入ってるっぽいし、こことlocaleだけ表示するようにしとこか。

こんなんでええか。実験するで。
今回は以下の21種類の画像でやるわ。

(1)
f:id:deeptoneworks:20160919233235p:plain
(2)
f:id:deeptoneworks:20160919233236p:plain
(3)
f:id:deeptoneworks:20160919233237p:plain
(4)
f:id:deeptoneworks:20160919233238p:plain
(5)
f:id:deeptoneworks:20160919233240p:plain
(6)
f:id:deeptoneworks:20160919233241p:plain
(7)
f:id:deeptoneworks:20160919233242p:plain
(8)
f:id:deeptoneworks:20160919233243p:plain
(9)
f:id:deeptoneworks:20160919233244p:plain
(10)
f:id:deeptoneworks:20160919233245p:plain
(11)
f:id:deeptoneworks:20160919233246p:plain
(12)
f:id:deeptoneworks:20160919233247p:plain
(13)
f:id:deeptoneworks:20160919233248p:plain
(14)
f:id:deeptoneworks:20160919233249p:plain
(15)
f:id:deeptoneworks:20160919233250p:plain
(16)
f:id:deeptoneworks:20160919233251p:plain
(17)
f:id:deeptoneworks:20160919233252p:plain
(18)
f:id:deeptoneworks:20160919233253p:plain
(19)
f:id:deeptoneworks:20160919233254p:plain
(20)
f:id:deeptoneworks:20160919233255p:plain
(21)
f:id:deeptoneworks:20160919233256p:plain

結果

画像番号 認識結果-言語 認識結果-文字 正負
1 x
2 x
3 x
4 ja 持家う x
5 ja 公営の借家 o
6 ja 公団·公社の借家 o
7 zh-Hant 長屋建 o
8 ja 一戸建 o
9 ja 総数 o
10 ja その他 o
11 ja 間借 x
12 ja (再掲) 世帯が住んでいる階 o
13 ja 全体の階数 o
14 ja 住宅の所有の関係(6区分) o
15 en 38 o
16 x
17 en 31.4 o
18 en 36.0 o
19 en Rented rooms o
20 en Owned houses o
21 pt-PT Principal households o

ええ感じやん!!日本語もかなりの精度でとれてると思うで!
間借りと間借とかもう正解でええしな。
さすがgoogle様や!
zh-Hantは中国語、pt-PTはポルトガル語やな!ここがあってるかどうかはどうでもええわ!!

ただなあ、数字のセルを全部このAPIにかけてたら金がいくらあっても足りひんで・・ 。何万とデータがあるからな・・・。
文字のセルはともかく、数字のセルだけでもこっちで認識させてあげられへんかなあ??

1 2