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")
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")
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))
PCAではあまりうまく分離できないので,t-SNE(ティー・スニー)(t-SNE も参照)をしてみる(とても時間がかかる):
from sklearn.manifold import TSNE y = TSNE(n_components=2).fit_transform(x)
より新しい UMAP もやってみる(あらかじめ pip install umap-learn
しておく)。t-SNEよりずっと速い。NumbaというJITを使っているので警告が出ることがある。
import umap y = umap.UMAP().fit_transform(x)
これらの図よりもしかしたら見やすいかもしれない手書き文字そのものによるプロットはこちら。
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: