メリークリスマス。皆さんいかがお過ごしでしょうか。ポンダッドです。
今回は、深層学習(ディープラーニング)の画像分類で主流となっている「畳み込みニューラルネットワーク(CNN、Convolutional Neural Network)」を利用して数字認識を試してみました。
なんだかもの凄く難しそうな感じがしますが、深層学習ライブラリ「Keras」と学習済みモデルを利用しますので気軽に試す事が出来ます。
さて、実際に試してみましょう。
私が手書きした数字の5(下手くそな字ですね)を人工知能に見せてみます。
手書き文字をバイナリ化しました。以前scikit-learn
で試した時は8×8ピクセルだったのですが、今回は28×28ピクセルです。試しにCSVデータにしてエクセルで見てみましょう。
こんな感じでズラッと数字が784セル分並んでいます。0が黒で255が白となる256段階の数値が格納されています。
今回利用するモデルは、Kerasのメイン開発者François Cholletさんが公開しているmnist_cnn.py - GitHubを利用しました。
認識率99.25%というスコアを出しているモデルです。「畳み込みニューラルネットワーク」の構造はこの様になっています。
パッと見ただけでは何をしているのか良く分からないですが、元となる画像データを何層もフィルタをかけているのが見て取れます。
通常の機械学習では、特徴量を分類する仕組みを人間が指定しますが、深層学習ではデータから機械が自ら特徴量を学習していきます。
ここでは訓練データ60,000とテストデータ10,000を元した学習結果を元に、指定されたデータが何の数字を示すのか推測します。
|
|
数字「5」を正しく判別できました。
プログラムは事前に学習したモデルを読み込んでいるので意外とコンパクトです。
|
|
仕組み
上記の仕組みをざっくり説明するとこんな感じになります。
- 訓練データとテストデータを読み込む
- 学習済みモデルを読み込む
- 予測データを読み込む
- 学習済みモデルから予測する
もう少し詳しくまとめてみます。
訓練データとテストデータを読み込む
Keras
ではデフォルトでMNIST(エムニストって読むみたいですね。最近知った)データを読み込むことが出来ます。
こんなデータが訓練データ60,000・テストデータ10,000あります。これを白黒(1次元)28×28ピクセルで読み込みます。
|
|
ちょっと注意が必要なのが、学習しやすい型に事前に変換しなければならない点です。ここではfloat32
型(浮動小数点数32ビット)に変換します。
色調256段階は計算しやすい様に0〜1に正規化します。(色調120
は0.470...
となります)
また、ラベルとなる数字0〜9も計算しやすい様に、10次元へと正規化します。(ラベルの数字5
は10次元配列に直すと[0,0,0,0,1,0,0,0,0,0]
になります)
|
|
学習済みモデルを読み込む
上述のmnist_cnn.py - GitHubで事前に学習したモデルは以下を追記する事でデータ化(json
ファイルとhdf5
ファイル)出来ます。
|
|
データ化した学習モデルは、
|
|
この様に読み込み、そのまま再利用が可能だという訳です。
予測データを読み込む
手書き文字データをバイナリ化するのには画像処理データライブラリPIL
を利用しました。
|
|
画像を28×28ピクセル、白黒画像で読み込みnumpy
のfloat
型にします。
学習モデルに合わせて正規化することで、予測データとして利用出来る様になります。
|
|
学習済みモデルから予測する
Keras
の特徴はこちらのブログでズバリまとめられています。
Kerasはレゴブロックを組み合わせるかのようにして、簡単にディープラーニングのモデルを作成できる便利なライブラリです。これを使って楽しく開発できるのではないかと思います。
「レゴブロック(!)」の様に、様々なメソッドが用意されています。ここで使用するmodel.predict_classes()
メソッドなど、まさにそんな感じです。
Sequentialモデルの API - Keras Documentation
学習済みモデルに予測データを追加することで、そのラベルが何か推測してくれます。
|
|
これだけです。
まとめ
深層学習ライブラリKeras
の使い方を少しまとめてみました。
「畳み込みニューラルネットワーク」に関して、正直「ブラックボックスでいいや。」と思っていたのですが、中身にも興味が出てきたので少し学習してみようかな。と思っています。
機械に勉強させるのも楽じゃないですね(笑)。ではまた。
参考書籍
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装 - Amazon.co.jp
はじめての深層学習(ディープラーニング)プログラミング - Amazon.co.jp
Pythonによるスクレイピング&機械学習 開発テクニック BeautifulSoup,scikit-learn,TensorFlowを使ってみよう - Amazon.co.jp