2018年12月28日SHAREツイートシェアはてブLINEPocket注意:このページはPC版で見ることを推奨します。皆さんはスマホの手書き入力を使った事がありますか?有名なもので言うと、Googleの手書き文字入力アプリがあります。私は今初めて使ってみたのですが、このアプリの精度の高さに感動しています。「憂鬱」という字を書いた。崩れていても、ちゃんと書いていなくても認識してくれる。この手書き文字認識は、「深層学習」というAIの技術によって制度を格段に上げられました。深層学習についてはひとまず置いておいて、早い話が手書き文字認識は深層学習の分野ということです。深層学習を用いないで手書き文字認識を実現してみたいさて、この技術、もっと単純な学習によって実装できないだろうか?個人的に気になったので、単純なものなら深層学習を用いない機械学習でも実装できるかどうかを検証してみたいと思います。画像のピクセル毎の明暗データを説明変数とし、画像に書かれている数を目的変数にすることで機械学習のモデルに適用させるという感じです。手書きの数字1文字が何であるかを判断するプログラム”Handwrite_recognition.py”を実装しました。機械学習のモジュール。画像データ処理のモジュール。ディレクトリの操作を簡単にするモジュール。配列計算の効率化モジュール。カンタン!今回の実装の目的は、sklearnのデータセットを使って機械学習をする深層学習を用いずに手書きの数字を判別するPILを使って画像データを加工するこの3つですそれでは早速、コードを順を追って見ていきましょう。train_test_splitここではsklearnから手書き文字のデータ(load_digits)ロジスティック回帰のモジュール(LogisticRegression)教師データの分割をするモジュール(train_test_split)をインポートします。-1)]画像はあらかじめ正方形のサイズのものを用意しておき、読み込んだものを8×8の64画素、16段階の白黒反転グレースケールにします。教師データと形式を一致させるために、画像一枚を64次元の配列にしてデータにしているというわけです。画像の中の一番明るい部分が16、一番暗い部分が0になるような計算を挟むことでsklearnのデータセットとかたちを同じにしています。手書き文字の画像を読み込んで、データセットに合う型に加工する。random_state=0)#ロジスティック回帰のモデルを作る。y_test))内容自体はシンプルです。sklearnに付属している手書き文数字のデータセットを教師データにします。教師データを読み込み、そのうちの半分を使って学習します。logreg_modelは教師データから学習したモデルになるので、あとはこのモデルを使うだけです。ここで教師データを半分にした理由は、過学習を少しでも予防するためです。似通った教師データばかり与えてしまうと、新規のデータに対応できなくなってしまうのです。このことを汎化能力の低下といいます。今回テストしてもらうデータは少し左にずれていたりするので、真ん中揃いのデータばかりで学習されては汎化能力が下がってしまいます。“スコア”はモデルのデータに対する精度です。教師データからどれほど学習できたかを確認するため、学習結果を出力します。機械学習の方法については検証の必要性もあるでしょうが、今回はよく例として取り上げられるロジスティック回帰のインスタンスを使ってみました。X_true))logreg_model.predict()にデータを放り込むと、判別した結果を返します。楽ちん!ついでに正答率も見ておきたいので、あらかじめ画像ファイル名の頭文字を中身の数字にしておいて、正解とのスコアを出せるようにしています。まとめたものは下の方に置いてあります。それでは動かしてみましょう。実際に手書き文字を読み込んで判別してもらう今回判別してもらう数字はこちらです。1,4,7は三種類の書き方を用意しました。