MNISTって何?数字を識別できる学習モデルの作成方法

MNISTとは

こんにちは。

AI coordinatorの清水秀樹です。

MNISTとは手書き数字画像60000枚とテスト画像10000枚を集めた画像データセットになります。

ニューラルネットワークを学ぶ上で、便利な画像データセットとして有名です。

どんな手書き数字画像かというと、こんな感じの画像になります。

MNISTは簡単な実験から研究まで幅広く使われるデータセットになっています。

今回はそんなMNISTを使って、手書き数字を識別できる学習モデルの作成に挑戦したいと思います。

 

参考にした書籍

これからDeep Learningの勉強をするなら、こちらで紹介する書籍が参考になります。

 

環境

macOS Sierra

Anaconda3-4.2.0-MacOSX-x86_64

keras 1.2.2

tensorflow 0.12.1

 

実際の画像データの中身を確認してみよう

学習モデルを作成する上で、色々なサンプルソースコードがありますが、それをだた動かしただけではいまいち理解できないと思います。

実際にどんなデータがMNISTに入っているのか確認してみましょう。

以下のソースコードを動かしてみるとイメージがつきやすいかと思います。

# -*- coding: utf-8 -*-

import sys
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from PIL import Image

(X_train, y_train), (X_test, y_test) = mnist.load_data()

#X_trainの画像化とy_trainの値
#1番目のトレーニングの画像データについて調べてみる
train_no = 0

print('訓練画像')
for xs in X_train[train_no]:
    for x in xs:
        sys.stdout.write('%03d ' % x)
    sys.stdout.write('\n')
    
outImg = Image.fromarray(X_train[train_no].reshape((28,28))).convert("RGB")
outImg.save("train.png")

print('訓練ラベル(y_train) = %d' % y_train[train_no])


#X_testの画像化とy_testの値
#1番目のテストの画像データについて調べてみる
test_no = 0

print('テスト画像')
for xs in X_test[test_no]:
    for x in xs:
        sys.stdout.write('%03d ' % x)
    sys.stdout.write('\n')
    
outImg = Image.fromarray(X_test[test_no].reshape((28,28))).convert("RGB")
outImg.save("test.png")

print('テストラベル(y_test) = %d' % y_test[test_no])

このPGMは学習用データ1件目とテストデータ1件目を表示するPGMになります。

簡単に補足すると、

X_train = 学習用画像データ、y_train = 学習用ラベル、X_test = テスト画像データ、y_test = テストラベル

となっているので、それぞれの中身を確認すると以下のような実行結果になります。

訓練画像
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 003 018 018 018 126 136 175 026 166 255 247 127 000 000 000 000 
000 000 000 000 000 000 000 000 030 036 094 154 170 253 253 253 253 253 225 172 253 242 195 064 000 000 000 000 
000 000 000 000 000 000 000 049 238 253 253 253 253 253 253 253 253 251 093 082 082 056 039 000 000 000 000 000 
000 000 000 000 000 000 000 018 219 253 253 253 253 253 198 182 247 241 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 080 156 107 253 253 205 011 000 043 154 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 014 001 154 253 090 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 139 253 190 002 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 011 190 253 070 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 035 241 225 160 108 001 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 081 240 253 253 119 025 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 045 186 253 253 150 027 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 016 093 252 253 187 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 249 253 249 064 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 046 130 183 253 253 207 002 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 039 148 229 253 253 253 250 182 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 024 114 221 253 253 253 253 201 078 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 023 066 213 253 253 253 253 198 081 002 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 018 171 219 253 253 253 253 195 080 009 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 055 172 226 253 253 253 253 244 133 011 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 136 253 253 253 212 135 132 016 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
訓練ラベル(y_train) = 5
テスト画像
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 084 185 159 151 060 036 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 222 254 254 254 254 241 198 198 198 198 198 198 198 198 170 052 000 000 000 000 000 000 
000 000 000 000 000 000 067 114 072 114 163 227 254 225 254 254 254 250 229 254 254 140 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 017 066 014 067 067 067 059 021 236 254 106 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 083 253 209 018 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 022 233 255 083 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 129 254 238 044 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 059 249 254 062 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 133 254 187 005 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 009 205 248 058 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 126 254 182 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 075 251 240 057 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 019 221 254 166 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 003 203 254 219 035 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 038 254 254 077 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 031 224 254 115 001 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 133 254 254 052 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 061 242 254 254 052 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 121 254 254 219 040 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 121 254 207 018 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 
テストラベル(y_test) = 7

なんとなく数字の5と7に見えるかと思います。

以下が出力される学習用画像データとテスト用画像データです。

ちっちゃいですね。

 

MNISTは学習用データとテスト用データを持っていて、それぞれ画像データとラベル(正解の数字)を持っている画像の塊データだということがこれで分かるかと思います。

では実際にMNISTを使って学習モデルを作成してみましょう。

 

MNISTを使った学習モデルの作成

学習モデルは2つできます。

jsonファイルとhdf5ファイルです。

 

それでは早速、学習モデルの作成をしてみましょう。

以下のソースコードを実行してみてください。

from keras.datasets import mnist
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import Adam 
from keras.utils import np_utils

def build_model():
 # モデルの作成
 model = Sequential()
 model.add(Dense(512, input_shape=(784,)))
 model.add(Activation('relu'))
 model.add(Dropout(0.2))

 model.add(Dense(512))
 model.add(Activation('relu'))
 model.add(Dropout(0.2))

 model.add(Dense(10))
 model.add(Activation('softmax'))

 # 損失関数の定義
 model.compile(
 loss='categorical_crossentropy',
 optimizer=Adam(),
 metrics=['accuracy'])
 
 return model

if __name__ == "__main__":
 # MNISTのデータの読み込み
 # 訓練データ6万件、テストデータ1万件
 # 28ピクセル × 28ピクセル = 784ピクセルのデータ
 # 色は0〜255
 (X_train, y_train), (X_test, y_test) = mnist.load_data()
 X_train = X_train.reshape(60000, 784).astype('float32')
 X_test = X_test.reshape(10000, 784).astype('float32')
 X_train /= 255
 X_test /= 255

 # 10次元配列に変換 //数字の5ならこんな感じ[0,0,0,0,1,0,0,0,0,0]
 y_train = np_utils.to_categorical(y_train, 10)
 y_test = np_utils.to_categorical(y_test, 10)

 # データで訓練 今回は時間省略のため2回で学習する
 model = build_model()
 model.fit(X_train, y_train, 
 nb_epoch=2, #学習させる回数 今回は2 回数はお好みで pytyonのnb_epochとはrangeの繰り返しのこと
 batch_size=128, #無作為に128画像取得している。数字はなんでも良い
 validation_data=(X_test, y_test)
 )


 #学習モデルの保存
 json_string = model.to_json()
 #モデルのファイル名 拡張子.json
 open('mnist.json', 'w').write(json_string)
 #重みファイルの保存 拡張子がhdf5
 model.save_weights('mnist.hdf5')

 # モデルの評価を行う
 score = model.evaluate(X_test, y_test, verbose=1)

 print('loss=', score[0])
 print('accuracy=', score[1])

実行結果は以下の通り。

Train on 60000 samples, validate on 10000 samples
Epoch 1/2
60000/60000 [==============================] - 8s - loss: 0.2551 - acc: 0.9230 - val_loss: 0.1171 - val_acc: 0.9637
Epoch 2/2
60000/60000 [==============================] - 8s - loss: 0.1016 - acc: 0.9686 - val_loss: 0.0800 - val_acc: 0.9752
 9376/10000 [===========================>..] - ETA: 0sloss= 0.080007992228
accuracy= 0.9752

97%の正答率をもつモデルを作成することができました。

時間短縮のため、epoch=2という少ない数字での学習ですが、中々の精度を出すことができます。

データが分かりやすいからでしょう。

実際は500とか1000とかいう数字で学習するのが一般的ですね。

 

次はこの作成した学習モデルを使って、数字画像の識別に挑戦していきたいと思います。

 


その他の物体検出記事はこちらから

 

それではまた。

あなたにオススメの記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

PAGE TOP