2024/5/7更新
コード実行時に毎回データを取得しているため動作が遅い
→アクセス後にpickle形式で保存することで解消
はじめに
オライリー社の『ゼロから作るDeepLearning』で画像認識の勉強中に、MNISTデータセットの準備で詰まったので解決法を共有します
問題
P.72 3.6.1 MNISTデータセット
用意されているスクリプトのload_mnist()関数を実行時、以下のエラーが出る
(X_train, t_train), (X_test, t_test) = load_mnist(flatten=True, normalize=False)
# エラーコード ------------------------------------------------------------------
HTTPError: HTTP Error 403: Forbidden
エラーの原因を調べてみると
サイト側のアクセス制限によりダウンロードができないらしい
解決方法
sklearnのfetch_mldata関数を利用
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
mnist_X, mnist_y = fetch_openml("mnist_784", version=1, data_home=".", return_X_y=True)
X = mnist_X.astype("float32").to_numpy()
y = mnist_y.astype(int).to_numpy()
# 学習用と評価用に分割
X_train, X_test, t_train, t_test = train_test_split(X, y, test_size=10000)
これで当書と同じようにデータをnumpy配列で取得し、学習用と評価用に分割ができた
また、再利用に備えPickle形式で保存しておくと便利
# pickle形式で保存
import pickle
with open('mnist_X.pkl', 'wb') as f:
pickle.dump(X, f)
with open('mnist_y.pkl', 'wb') as f:
pickle.dump(y, f)
pikleファイルの読み込み
with open('mnist_X.pkl', 'rb') as f:
X = pickle.load(f)
with open('mnist_y.pkl', 'rb') as f:
y = pickle.load(f)
おわりに
skleanの関数を利用することで、配布スクリプトと同じようにMNISTデータセットをnumpy配列で取得し、学習用と評価用に分割ができた
参考