新着情報

MNISTデータセット(手書き数字画像データ)について

手書き数字の分類の標準データセットMNIST

手書き数字MNIST(Mixed NIST)データ・セットは、1980年代にNIST(National Institude of Standards and Technology: アメリカ国立標準技術研究所)により作成された手書き数字の60,000個の訓練用画像と10,000個のテスト画像で構成されたデータセットである。このMNISTデータセットは機械学習コミューニティの使用すべき標準的なデータセットとなっている。

次のサイトから無料ダウンロードできる。

The MNIST DATABASE of handwritten digits

 

このダウンロードサイトは畳み込みニューラルネットワーク(CNN)を発表したNew York University のヤン・ルカン(Yann LeCun)が運用している。
Deep Learningのフレームワークの一つであるKerasライブラリからMNISTデータセットを直接importできるので、自分のPythonの計算機環境にKerasライブラリーをインストールすれば、必ずしもダウンロードの必要はない。

次のコードを入力すれば、MNISTデータセットを訓練画像を配列x_trainsに、その正解を配列y_trainsに読み込むことができ、又テスト画像を配列x_testsに、その正解を配列y_testsに読み込むことができる。読み込んだデータ数は描き配列のlen()関数をprintさせることにより調べることができる。

from keras.datasets import mnist
(x_trains, y_trains), (x_tests, y_tests) = mnist.load_data()
print(len(x_trains))  # 手書き数字の訓練画像データx_trains の数
print(len(y_trains))  #x_trainsの各画像データが示している0~9の値の数
print(len(x_tests))   # 手書き数字のテスト画像データx_tests の数
print(len(y_tests))   # x_testsの各画像データが示している0~9の値の数

上記のコードを実行させると、

MNISTデータセットから読み込まれたトレーニング画像データの数、60,000

x_trains の各画像データが示している0~9の値の数、60,000

手書き数字のテスト画像データの数、10,000

x_teastsの各画像データが示している0~9の値の数10,000が出力される。

また、次のpythonプログラムmnist-digit.pyを実行することにより、

訓練用手書きの画像は28×28画素(784画素)のデータとして配列x_trainsに格納されている。これを具体的に示すため、x_trains[4]からx_trains[10]までの7個の手書き数字画像と正解を格納しているy_trains[4]からy_trains[10]を並べて表示できるpythonのプログラムを以下に示す。


import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.figure(1, figsize=(15, 3)) # 横15インチ、縦3インチの全体画像サイズ
plt.subplots_adjust(wspace=0.5)
plt.gray()
for id in range(4,11): # x_trains[4]からx_trains[10]までの7個の手書き数字の訓練画像データをプロットする
    plt.subplot(1,12, id + 1)   
    # 784個のRGB値を28×28の行列にする
    img = x_trains[id, :, :].reshape(28, 28)
    # 色相を反転させてプロットする
    plt.pcolor(255 - img)
    # 画像の正解値をプロット
    plt.text(22, 26, "%d" % y_trains[id], color='blue', fontsize=18)
    plt.xlim(0, 27) # x軸を0~28の範囲
    plt.ylim(27, 0) # y軸を28~0の範囲
plt.show()

 

ニューラルネットワークを使って手書き数字を学習し、テスト用のデータで的中精度を評価する

まず、訓練用手書き数字画像のデータと正解ラベルを変形する。訓練用手書き数字画像のデータ値を255で割って、0.0から1.0の範囲に変換する。これは活性化関数(シグモイド関数)の取り得る値の範囲に合わせるためである。また、正解データを格納したy_trainsの中身も出力される複数のニューロンからの発火に対応させる必要がある。手書き数字は0から9の数字なので、全部で10個のパターンがあり、出力層のニューロン数は10個とできる。例えば、正解が3の時は出力層が第0ニューロンから第9ニューロンだ構成されているとすれば、その第4ニューロンが発火する。この時、正解ラベルは1列x10行の行列に設定し、以下の様な数値並びを持つ列行列なる様に設定する。シグモイド関数は0や1に近い値は出力できるが、0値や1値を出力しないので、0の代わりに、0.01を1の代わりに0.99を用いるものとする。この正解ラベル配列を出力するpythonプログラムの具体例を示す。

output_neurons = 10 # 出力層のニューロンの数
# 出力層のニューロン数に合わせて目標配列を作成
targets = np.zeros(output_neurons) + 0.01
# 正解値に対応する要素を0.99にする
targets[4] = 0.99
print(targets)

出力例:

[0.01, 0.01, 0.01, 0.99, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]

コメント投稿フォーム

メールアドレスが公開されることはありません。 が付いている欄は必須項目です