【Keras】MNISTのアラビア数字を識別する

 

この記事では、kerasを使ってMNIST(エムニスト)データセットの学習、テストにチャレンジしてみます。

 

解説を交えながら、jupyterノートブック上で順番にコードを実行していきたいと思います。

 

スポンサーリンク

 

事前準備

 

kerasとtensorflowを使うので、pipで入れておきましょう。

 

それが終わったら、使用するライブラリをimportします。

 

バッチサイズや分類するクラス数、エポックの数もここで決めておきます。

 

 

MNISTデータセットの中身

 

どんなデータを扱うのか、中身をみてみます。

 

 

実行結果は以下の通り。

 

 

28*28の正方形の画像データが、学習用に6万枚、テスト用に1万枚あるようです。

 

データの変換

 

このままだと学習に使用できないので、データの形式を変換します。

 

 

実行結果は以下の通り。

 

 

データとラベルがそれぞれ一次元に変換できました。

 

モデルの作成

 

逐次モデルを作っていきます。以下のような3層のニューラルネットを作ってみます。

 

一層目:

  • Dense → Activation → Dropout
  • 784次元のデータを任意の数だけ入力、出力は512次元
  • activationには、reluを指定
  • dropoutで約2割の入力ユニットを0にする

二層目:

  • Dense → Activation → Dropout
  • 512次元の入力データ、出力は512次元

三層目:

  • Dense → Activation
  • 入力は512次元、出力は10次元
  • activationにはsoftmaxを指定

 

 

サマリーの出力は以下の通り。

 

 

Paramは、入力と出力の次元を掛け合わせた値になっています。例えば最初の層は、

 

(784+1) * 512 = 401920

 

となります。+1はバイアスが追加されているからです。

 

学習

 

定義したモデルで学習してみます。ポイントは以下の通り。

 

学習を行う:

  • lossの基準にクロスエントロピーを指定
  • EarlyStoppingはある程度学習が進んだら、早期終了する
  • CSVLoggerを使って、学習結果を保存する

 

 

実行すると4回でEpochが終了したようです。

 

 

acc=精度をみるとどんどん上がっているのが分かります。

 

テスト

 

 

 

約98%の精度で判別できました。

 

学習結果の可視化

 

 

 

グラフのように、学習データに対する損失は下がっています(=精度は上がっている)が、テストデータに対する損失はあまり下がっていません(=精度が上がらない)。

 

この現象は過学習と呼ばれています。

 

参考

ABOUTこの記事をかいた人

のっくん

理系院卒で大企業の研究所に就職。 趣味はプログラミング、レアジョブ英会話、筋トレ、旅行。 Twitter:@yamagablog