「ゼロから作るDeep Learning」自習メモ（その３）3.6.1 MNISTデータセットのダウンロード

「ゼロから作るDeep Learning」(斎藤 康毅　著　オライリー・ジャパン刊)を読んでいる時に、参照したサイト等をメモしていきます。　[その２](https://qiita.com/slow_learner/items/7caefc9ff17b4f543b15)←　→[その４](https://qiita.com/slow_learner/items/d914454ecee154e98cd2)

##3.6.1 MNISTデータセットのダウンロード

P72 MNIST データセット　についてのところで、つまづきました。

本の内容が難しいわけではなく、単純にファイルのダウンロード方法や、ダウンロードしたファイルの加工方法とかが、よくわかりませんでした。

で

Qiita の記事を参考にさせてもらいました。

[PythonでMNISTをダウンロードして前処理する](https://qiita.com/python_walker/items/e4d2ae5b7196cb07402b)

この記事を参考にして、自分でMNISTファイルをダウンロード、加工してみました。

```python
import urllib.request  # データをホームページからダウンロード
import os.path

url_base = 'http://yann.lecun.com/exdb/mnist/' #MNISTのホームページ
key_file = {
    'train_img':'train-images-idx3-ubyte.gz',
    'train_label':'train-labels-idx1-ubyte.gz',
    'test_img':'t10k-images-idx3-ubyte.gz',
    'test_label':'t10k-labels-idx1-ubyte.gz'
}

#データを保存するフォルダ
dataset_dir = os.path.dirname(os.path.abspath('__file__'))+'/dataset'

for file_name in key_file.values():
    file_path = dataset_dir + '/' + file_name
    urllib.request.urlretrieve(url_base + file_name, file_path)
```

このプラグラムを実行すると、指定したフォルダに４つのファイルがダウンロードされます。
![p72.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686010/740d26e9-1870-d697-6816-826eb6f44cbd.jpeg)

```python
# 保存したデータの内容を確認する
import os.path
import gzip
import numpy as np

key_file = {
    'train_img':'train-images-idx3-ubyte.gz',
    'train_label':'train-labels-idx1-ubyte.gz',
    'test_img':'t10k-images-idx3-ubyte.gz',
    'test_label':'t10k-labels-idx1-ubyte.gz'
}
# dataset_dir = 'C:/Users/（ユーザー名）/dataset' 
dataset_dir = os.path.dirname(os.path.abspath('__file__'))+'/dataset'
file_path = dataset_dir + '/' + key_file['train_img']    #試しにtrain_imgを見てみる
with gzip.open(file_path, 'rb') as f:
    data = np.frombuffer(f.read(), np.uint8)

len(data)    #->47040016
```

```python
# 画像データtrain_img　の頭１６バイトには、ファイルについての情報がのっている。これを除去してファイルを解凍する
# 同様にラベルデータの頭８バイトを除去してファイルを解凍する

import gzip
import numpy as np

key_file = {
    'train_img':'train-images-idx3-ubyte.gz',
    'train_label':'train-labels-idx1-ubyte.gz',
    'test_img':'t10k-images-idx3-ubyte.gz',
    'test_label':'t10k-labels-idx1-ubyte.gz'
}
dataset_dir = 'C:/Users/（ユーザー名）/dataset' 

def load_img(file_name):
    file_path = dataset_dir + '/' + file_name
    with gzip.open(file_path, 'rb') as f:
        data = np.frombuffer(f.read(), np.uint8, offset=16)
    data = data.reshape(-1, 784)
    return data

def load_label(file_name):
    file_path = dataset_dir + '/' + file_name
    with gzip.open(file_path, 'rb') as f:
        labels = np.frombuffer(f.read(), np.uint8, offset=8)
    return labels

dataset = {}
dataset['train_img'] = load_img(key_file['train_img'])
dataset['train_label'] = load_label(key_file['train_label'])
dataset['test_img'] = load_img(key_file['test_img'])
dataset['test_label'] = load_label(key_file['test_label'])

# 必要な形式に変換した datasetオブジェクトを、pickleで保存する
import pickle
save_file = dataset_dir + '/mnist.pkl'    #拡張子は.pkl
with open(save_file, 'wb') as f:
    pickle.dump(dataset, f, -1) 
```
mnist.pkl というファイルが保存される。
![p73.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686010/f7ada2fc-0b02-eca2-fc33-c38d98f3fd86.jpeg)

```python
# 保存したデータを読み込んで、dataset に格納する
import pickle

dataset_dir = 'C:/Users/（ユーザー名）/dataset' 
mnist_file = dataset_dir + '/mnist.pkl'

with open(mnist_file, 'rb') as f:
    dataset = pickle.load(f)
```
```python
# 確認　データ数（行列の行数）を調べる
dataset['train_img'].shape    #-> (60000, 784)
```
```python
# 確認　データ数（行列の行数）を調べる
dataset['train_label'].shape   #-> (60000,)
```
```python
# 訓練画像の表示
import matplotlib.pyplot as plt

example = dataset['train_img'][0].reshape((28, 28))
l = dataset['train_label'][0] 
print(l)
plt.figure()
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(example)
plt.show()
```
![p75.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686010/a958b0bf-5213-d7dc-b93e-fe257bcbd66a.jpeg)

#参考にしたサイト
[PythonでMNISTをダウンロードして前処理する](https://qiita.com/python_walker/items/e4d2ae5b7196cb07402b)
[MNIST データの仕様を理解しよう](https://weblabo.oscasierra.net/python/ai-mnist-data-detail.html)


[その２](https://qiita.com/slow_learner/items/7caefc9ff17b4f543b15)←　→[その４](https://qiita.com/slow_learner/items/d914454ecee154e98cd2)

[読めない用語集](https://qiita.com/slow_learner/items/03eb3367119e98b5a22c)