【Python/Keras】CNNで手書き文字認識(mnist)の学習・識別

Pythonの深層学習モジュール「Keras」とCNN(畳み込みニューラルネットワーク)で手書き文字認識(mnist)の学習・識別方法をソースコード付きで解説します。

【Keras】CNN(畳み込みニューラルネットワーク)で手書き文字認識

Pythonの深層学習モジュール「Keras」とCNN(畳み込みニューラルネットワーク)で手書き文字画像の分類を行います。

動画解説

本ページの内容は以下動画でも解説しています。

CNNとは

畳み込みニューラルネットワーク(CNN:Convolutional Neural Network)とは、ディープラーニングの手法の1つで、主に画像認識に利用されています。
ニューラルネットワークの重み計算に「畳み込み演算(Convolution)」が用いられていることから、CNNと呼ばれています。

404 NOT FOUND | Python入門速報

mnistとは

mnistのデータセットは、「6万枚の手書き数字の学習用画像」と「1万枚のテスト画像」が格納されています。
これらの画像は全て28×28[px]のグレースケール画像となっています。
mnistのデータセットは、機械学習の性能評価によく用いられます。

MNISTの手書き数字画像

入力データ 1つの数字が書かれた画像データ。MNISTの画像1つは 28×28(=784)pxの大きさです。 1pxに「白:255」〜「黒:0」までの色情報が記録されています。 1つの画像の全てのピクセルの情報を入力するので、入力数は784個となる。
出力データ 入力された画像データが「0」〜「9」のどの数字画像なのか、その確率を「0」〜「9」毎に出力。そのため出力数は10で、最も確率の高いものが、予測結果の数字となる。

例「0.7, 0, 0, 0, 0, 0, 0.2, 0, 0, 0.1」
(0の確率70%, 6の確率20%, 9の確率10%, 他0%)

One-Hotエンコーディング One-Hotとは、「1つだけ1でそれ以外は0のベクトル(行列)」のことです。One-Hotエンコーディングは、カテゴリー変数をOne-Hotのベクトル(行列)に変換することです。

【サンプルコード1】データセットを使って分類器を作成

サンプルプログラムのソースコードです。


【サンプルコード2】作成した分類器で手書き画像の分類

作成した分類器をロードし、以下の「2」と描かれた画像を入力して、数字を当てられるか試してみます。
画像のロード、変換等はOpenCVを使います。


無事に「2」と正解できました。

【TensorFlow版Keras入門】ディープラーニングを簡単に学ぶ方法
Pythonモジュール「TensorFlow/Keras」で深層学習(ディープラーニング)を行う方法について入門者向けに使い方を解説します。

コメント

  1. 匿名 より:

    初心者です。
    サンプルコード2の7行目で
    cannot import name ‘np_utils’ from ‘tensorflow.keras.utils’
    というエラーが出たのですが、[pip install np_utils] を入れても治りません対処法はありますか?

    • 管理人 より:

      コメントありがとうございます。
      最新のTensorFlowだとkeras.utilsが最初から組み込まれているはずですので、お使いのTensorFlowのバージョンを確認されてみてはと思います。

  2. 匿名 より:

    Python「Keras」とCNNを用いた手書き文字識別を解説をいただきありがとうございます!
    ソースコード内に十分にコメントを記載いただいているため、わかりやすかったです。

    サンプルコード1の17-18行目について、そのままだと私のほうではエラーとなってしまいましたが、「accuracy」を「acc」に変えることでエラーなく動きました。
    (環境 tensorflow:1.14.0、keras 2.2.4)