MNIST

MNIST(エムニスト)は28×28ピクセルの手書き画像で,ピクセル値は0から255までの整数である。

ここでは Tensorflow に含まれるものを使う:

import tensorflow as tf

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

これを最初に実行する際には,ネットからデータをダウンロードする。次回からはローカルにキャッシュされたデータ(~/.keras/datasets/mnist.npz,11Mバイトほど)を使う。拡張子 npz のファイルは NumPy の ndarray を収めたバイナリファイル 変数名.npy を束ねたZIPアーカイブである。詳しくは np.savez()np.load() のヘルプ参照。

トレーニング用が6万画像,テスト用が1万画像ある:

In [ ]: x_train.shape
Out[ ]: (60000, 28, 28)

In [ ]: y_train.shape
Out[ ]: (60000,)

In [ ]: x_test.shape
Out[ ]: (10000, 28, 28)

In [ ]: y_test.shape
Out[ ]: (10000,)

x_train に入っている画像を表示してみよう:

import matplotlib.pyplot as plt

plt.imshow(x_train[0])
plt.colorbar()
fig.savefig("mnistfig0.png", bbox_inches="tight")
MNIST
for k in range(24):
    plt.subplot(3, 8, k+1)
    plt.xticks([])
    plt.yticks([])
    plt.imshow(x_train[k], cmap='gray_r') # または cmap=plt.cm.binary
    plt.title(y_train[k]) # または plt.xlabel(y_train[k])
fig.savefig("mnistfig.png", bbox_inches="tight")
MNIST

2次元(28×28)を1次元(784)に展開して,主成分分析(PCA)を行ってみる:

x = x_train.reshape(60000, 28*28)

from sklearn.decomposition import PCA

y = PCA(n_components=2).fit_transform(x)
for i in range(10):
    plt.scatter(y[y_train == i,0], y[y_train == i,1], marker=f'${i}$', alpha=0.5)
plt.axis('equal')
plt.legend(range(10))
MNIST PCA

PCAではあまりうまく分離できないので,t-SNE(ティー・スニー)(t-SNE も参照)をしてみる(とても時間がかかる):

from sklearn.manifold import TSNE

y = TSNE(n_components=2).fit_transform(x)
MNIST t-SNE

より新しい UMAP もやってみる(あらかじめ pip install umap-learn しておく)。t-SNEよりずっと速い。NumbaというJITを使っているので警告が出ることがある。

import umap

y = umap.UMAP().fit_transform(x)
MNIST UMAP

これらの図よりもしかしたら見やすいかもしれない手書き文字そのものによるプロットはこちら

MNISTを拡張したEMNISTもある。日本で作られたETL文字データベースもある。MNISTと同様の形式で中身がファッション製品の Fashion-MNIST もある(mnist.load_data() の代わりに fashon_mnist.load_data() とすればよい)。

MNISTをロードする関数は,ほかにもいろいろなライブラリにある。以下はMXNetの例である。こちらはMXNetのNDArray型になる:

from mxnet import nd, gluon

mnist_train = gluon.data.vision.MNIST(train=True)
mnist_test = gluon.data.vision.MNIST(train=False)

img, lbl = mnist_train[0]
img.shape  # ==> (28, 28, 1)
img.max()  # ==> [255]
type(img)  # ==> mxnet.ndarray.ndarray.NDArray
type(lbl)  # ==> numpy.int32

データは ~/.mxnet/datasets/mnist/ 以下にキャッシュされる。


Last modified: