新着情報
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]