「ゼロから作るDeep Learning」(斎藤 康毅 著 オライリー・ジャパン刊)を読んでいる時に、参照したサイト等をメモしていきます。 その2← →その4
##3.6.1 MNISTデータセットのダウンロード
P72 MNIST データセット についてのところで、つまづきました。
本の内容が難しいわけではなく、単純にファイルのダウンロード方法や、ダウンロードしたファイルの加工方法とかが、よくわかりませんでした。
で
Qiita の記事を参考にさせてもらいました。
この記事を参考にして、自分でMNISTファイルをダウンロード、加工してみました。
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)
このプラグラムを実行すると、指定したフォルダに4つのファイルがダウンロードされます。
# 保存したデータの内容を確認する
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
# 画像データtrain_img の頭16バイトには、ファイルについての情報がのっている。これを除去してファイルを解凍する
# 同様にラベルデータの頭8バイトを除去してファイルを解凍する
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)
# 保存したデータを読み込んで、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)
# 確認 データ数(行列の行数)を調べる
dataset['train_img'].shape #-> (60000, 784)
# 確認 データ数(行列の行数)を調べる
dataset['train_label'].shape #-> (60000,)
# 訓練画像の表示
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()
#参考にしたサイト
PythonでMNISTをダウンロードして前処理する
MNIST データの仕様を理解しよう