導入
手書き文字認識のデータセットは、有名なデータセットです。いろいろなライブラリから活用できるように整備されているのですが、当時の自分は「ファイルって外部から読み込むんじゃないの」(←今思えば、よくわかるようなわからないような疑問)とか、あるいはネットで調べても読み込み方がいろいろあって、その関係性がわからなかったりして混同しておりました。
そういう人が他にもいるかもしれないなと思って、情報を整理する目的で書きました。
前提
sklearn、tensorflow、pytorchはインストールされている前提から話を始めます。(自分はAnacondaを使って環境を整えました)sklearn、tensorflow,pytorchの全てが必須ということではありません。それぞれの場合について説明をするという意味です。
OSはMacOSXを使用しています。
注意
いわゆる手書き文字認識のデータセットですが、似たようなものが2つあります。一つは、sklearnインストール時に一緒についてくる(標準で備わっている)手書き文字認識用のデータセットです。
二つ目は上記以外の方法で入手したものです。
一つ目のほうは、8×8ピクセルの画像から構成されています。
二つ目のほうは、28×28ピクセルの画像から構成されています。
どちらも「手書き文字認識」とか「Mnist」とかの検索で引っかかってくるし、なんとなく画像の雰囲気も同じ感じなので、いろいろ混同しておりました。
sklearnの標準搭載(8×8サイズのデータ)
データセットの場所
sklearn標準のデータセットは以下の場所にあります。/(環境によって違う部分)/lib/python3.7/site-packages/sklearn/datasets自分の場合のディレクトリ構成を参考までに。(Anacondaを使っています)
$ls /Users/hiroshi/opt/anaconda3/lib/python3.7/site-packages/sklearn/ //パスで指定された中のファイル・ディレクトリ一覧を表示 __check_build dummy.py model_selection __init__.py ensemble multiclass.py __pycache__ exceptions.py multioutput.py _build_utils experimental naive_bayes.py _config.py externals neighbors _distributor_init.py feature_extraction neural_network _isotonic.cpython-37m-darwin.so feature_selection pipeline.py base.py gaussian_process preprocessing calibration.py impute random_projection.py cluster inspection semi_supervised compose isotonic.py setup.py conftest.py kernel_approximation.py svm covariance kernel_ridge.py tests cross_decomposition linear_model tree datasets manifold utils decomposition metrics discriminant_analysis.py mixtureそしてその中のdatasetsフォルダをみてみると、
$ls /Users/hiroshi/opt/anaconda3/lib/python3.7/site-packages/sklearn/datasets __init__.py california_housing.py __pycache__ covtype.py _base.py data _california_housing.py descr _covtype.py images _kddcup99.py kddcup99.py _lfw.py lfw.py _olivetti_faces.py olivetti_faces.py _openml.py openml.py _rcv1.py rcv1.py _samples_generator.py samples_generator.py _species_distributions.py setup.py _svmlight_format_fast.cpython-37m-darwin.so species_distributions.py _svmlight_format_io.py svmlight_format.py _twenty_newsgroups.py tests base.py twenty_newsgroups.pyとなっています。
ここに手書き文字認識以外にも、データセットが用意されています。
さらに、フォルダを深く入っていきます。
$ ls /Users/hiroshi/opt/anaconda3/lib/python3.7/site-packages/sklearn/datasets/data boston_house_prices.csv diabetes_target.csv.gz linnerud_exercise.csv breast_cancer.csv digits.csv.gz linnerud_physiological.csv diabetes_data.csv.gz iris.csv wine_data.csvここに、sklearnを扱った記事でよく引用されるirisデータセットやboston_house_pricesデータセットなどがあります。
データセットのインポート方法
sklearnの公式ページのコードそのままではありますが。以下作業はターミナルからpythonを起動して行っています。
>>> from sklearn.datasets import load_digits >>> import matplotlib.pyplot as plt >>> digit=load_digits() >>> digit.data.shape (1797, 64) // (8×8=64列の行列として格納されている) >>> plt.gray() >>> digit.images[0] array([[ 0., 0., 5., 13., 9., 1., 0., 0.], [ 0., 0., 13., 15., 10., 15., 5., 0.], [ 0., 3., 15., 2., 0., 11., 8., 0.], [ 0., 4., 12., 0., 0., 8., 8., 0.], [ 0., 5., 8., 0., 0., 9., 8., 0.], [ 0., 4., 11., 0., 1., 12., 7., 0.], [ 0., 2., 14., 5., 10., 12., 0., 0.], [ 0., 0., 6., 13., 10., 0., 0., 0.]]) >>> plt.matshow(digit.images[0]) >>> plt.show()そうすると以下のような画面が立ち上がります。
オリジナルのデータをダウンロード(28×28サイズのデータ)
Mnistオジリナルのデータはこちらにあります。ただし、ここで入手できるのはそのままでは使用できないバイナリファイルです。
なので、自分でデータを使える形にまで加工しなければいけないところですが、以下でみていくように、Mnistは非常に有名なデータセットなので、いろいろなライブラリにすぐに使えるように整備されているツールがあります。
このバイナリデータを自力で元に戻す方法ももちろん存在はするようですが、そこまでフォローしきれなかったし、そこに時間かけるのもどうかと思ったのでその方法については触れません。
sklearn経由でダウンロード(28×28サイズ)
ネット上の記事をみていると、古い記事ではfrom sklearn.datasets import fetch_mldataとしている記事もありますが、現在ではアクセスしようとしている先のページが使用できないためエラーになります。
なので現在では以下のようにfetch_openmlを使用するようです。
(scikit-learn(sklearn)のfetch_mldataのエラーの解決法)
これも、ターミナルから起動してます。
>>> import matplotlib.pyplot as plt // 上からの流れてすでにインポート済かもしれませんが、一応。まだインポートしてなかった場合はこれもやる。 >>> from sklearn.datasets import fetch_openml >>> digits = fetch_openml(name='mnist_784', version=1) >>> digits.data.shape (70000, 784) >>> plt.imshow(digits.data[0].reshape(28,28), cmap=plt.cm.gray_r)>>>>>> plt.show()
tensorflow(28×28サイズ)
tensorflowのチュートリアルから入れる方法。>>> from tensorflow.examples.tutorials.mnist import input_dataとすればいけるらしいのですが、自分の場合は以下のようなエラーが出てしまいました。
結論からいうと、どうやらtensorflowをインストールする際に、tutorialのフォルダがダウンロードされないことがあるらしいです。
Traceback (most recent call last): File "実際のディレクトリの中身をみてみました。", line 1, in ModuleNotFoundError: No module named 'tensorflow.examples.tutorials'
$ls /Users/hiroshi/opt/anaconda3/lib/python3.7/site-packages/tensorflow_core/examples/ __init__.py __pycache__ saved_modelとなっていました。
以下のページを参考にしました。
- ModuleNotFoundError: No module named 'tensorflow.examples' (Stackoverflow)の上から5番目の回答
- TensorflowのGithubページ
tensorflow-masterというフォルダがあるので、そのなかのtensorflow-master\tensorflow\examples\の場所に、tutorialsというフォルダがあります。
このturorialsというフォルダをフォルダごと/Users/hiroshi/opt/anaconda3/lib/python3.7/site-packages/tensorflow_core/examples/の中にコピーします。
ここまでできれば、
>>> import matplotlib.pyplot as plt // 上からの流れてすでにインポート済かもしれませんが、一応。まだインポートしてなかった場合はこれもやる。 >>> from tensorflow.examples.tutorials.mnist import input_data >>> mnist = input_data.read_data_sets("MNIST_data", one_hot=True) >>> im = mnist.train.images[1] >>> im = im.reshape(-1, 28) >>> plt.imshow(im)とすれば、同様に画像が表示されるはずです。>>> plt.show()
keras(28×28サイズ)
>>> import matplotlib.pyplot as plt // 上からの流れてすでにインポート済かもしれませんが、一応。まだインポートしてなかった場合はこれもやる。 >>> import tensorflow as tf >>> mnist = tf.keras.datasets.mnist >>> mnist >>> mnist_data = mnist.load_data() Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz 11493376/11490434 [==============================] - 1s 0us/step >>> type(mnist_data[0])もう画像は載せませんが、うまくいけばまた画像が表示されます。//タプルで返ってくる。 >>> len(mnist_data[0]) 2 >>> len(mnist_data[0][0]) 60000 >>> len(mnist_data[0][0][1]) 28 >>> mnist_data[0][0][1].shape (28, 28) >>> plt.imshow(mnist_data[0][0][1],cmap=plt.cm.gray_r) >>> plt.show()
pytorch(28×28サイズ)
まずこれができないと先へ進めないらしいですが、>>> from torchvision.datasets import MNIST次のようにエラーがでてしまった。
torchvisionがないらしい。
自分の場合にはcondaでpytorchを入れる際に、単に
conda install pytorchしか行っていないからのようでした。
付属物までいれるには以下のようにするらしいです。
conda install pytorch torchvision -c pytorch確認を求められるのでyを押します。
(必要であれば)上記を行った上で、以下のようなコードを実行してみます。
>>> import matplotlib.pyplot as plt // 上からの流れてすでにインポート済かもしれませんが、一応。まだインポートしてなかった場合はこれもやる。 >>> import torchvision.transforms as transforms >>> from torch.utils.data import DataLoader >>> from torchvision.datasets import MNIST >>> mnist_data = MNIST('~/tmp/mnist', train=True, download=True, transform=transforms.ToTensor()) >>> data_loader = DataLoader(mnist_data,batch_size=4,shuffle=False) >>> data_iter = iter(data_loader) >>> images, labels = data_iter.next() >>> npimg = images[0].numpy() >>> npimg = npimg.reshape((28, 28)) >>> plt.imshow(npimg, cmap='gray')>>plt.show()
番外編(はじめてのDeeplearningより)
オライリーから出ている『ゼロから作る Deep Learning』では、この本が提供しているファイルの中で独立して行われています。具体的には、[『ゼロから作る Deep Learning』で使用されるファイルのgithubページ]でダウンロードしてきたフォルダの中で全て読み進めていきます。(もちろん、予めpythonやnumpyなどは準備しておく必要はありますが。
以下手順。
まず、上記で述べたGithubページからフォルダをダウンロードなりクローンしてきます。
ここでは、ダウンロードで行います。
そして解凍します。
そうするとdeep-learning-from-scratch-masterというフォルダができます。
各章ごとにフォルダ分けされているので、その章のフォルダへ移動して読み進めていく感じになります。
フォルダ自体はch01からありますが、Mnistのデータが使用されるのは第3章なので、ch03に入ることにします。
$ pwd /Volumes/SONY_64GB/deep-learning-from-scratch-master/ch03pythonを起動して・・・
>>> import sys,os >>> sys.path.append(os.pardir) >>> from dataset.mnist import load_mnist >>> (x_train,t_train),(x_test,t_test) = load_mnist(flatten=True,normalize=False) Downloading train-images-idx3-ubyte.gz ... Done Downloading train-labels-idx1-ubyte.gz ... Done Downloading t10k-images-idx3-ubyte.gz ... Done Downloading t10k-labels-idx1-ubyte.gz ... Done Converting train-images-idx3-ubyte.gz to NumPy Array ... Done Converting train-labels-idx1-ubyte.gz to NumPy Array ... Done Converting t10k-images-idx3-ubyte.gz to NumPy Array ... Done Converting t10k-labels-idx1-ubyte.gz to NumPy Array ... Done Creating pickle file ... Done! >>> print(x_train.shape) (60000, 784) >>> print(t_train.shape) (60000,) >>> print(x_test.shape) (10000, 784) >>> print(t_test.shape) (10000,) >>>
参考にしたページ
Mnistのオリジナルのデータ
- MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges
→Mnistのオリジナルのデータがあるページ。ここでダウンロードできるのはバイナリデータ。
sklearn
- sklearnの公式ドキュメントのdigitのページ (→一番上のdatasetのところをクリックすればsklearnが他にどんなデータセットを標準搭載しているかを示しているページへいける。)
- Scikit learnより SVMで手書き数字の認識(Qiita)
- scikit-learn(sklearn)のfetch_mldataのエラーの解決法(Qiita)
- MNIST データの仕様を理解しよう
- 手書き数字のデータを扱う!Pythonでmnistを使う方法【初心者向け】]
- 7.5.3. Downloading datasets from the openml.org repository¶
Tensorflow
- TensorFlow, Kerasの基本的な使い方(モデル構築・訓練・評価・予測)
- ModuleNotFoundError: No module named 'tensorflow.examples' (Stackoverflow)の上から5番目の回答
- TensorflowのGithubページ
Keras
Pytorch
- PyTorchでMNISTをやってみる
- conda install pytorch torchvision -c pytorch で PackageNotFoundError: Dependencies missing in current osx-64 channels: - pytorch -> mkl >=2018 と言われる