はじめに
ニューラルネットワークでミニバッチ学習させるためには、入力(X)と出力(y)をランダムに並べ替える必要がある。そこで、Xとyの各要素の対応を崩さないでランダムに並び替える方法を調べてみた。
結果
ベタな方法は、配列のインデックスをランダムに並べ替え、ランダムに並び替えたインデックスの並びでXとyの配列要素を各々取り出す。
import numpy as np
X = np.array([1, 2, 3, 4])
y = np.array([11, 12, 13, 14])
p = np.random.permutation(len(X))
X = X[p]
y = y[p]
Xとyをzipでまとめると、Xとyの要素を同時に並び替えることができる。
import numpy as np
X = np.array([1, 2, 3, 4])
y = np.array([11, 12, 13, 14])
zipped = list(zip(X, y))
np.random.shuffle(zipped)
X_result, y_result = zip(*zipped)
X = np.asarray(X_result)
y = np.asarray(y_result)
これを関数にすると以下の通り。
def shuffle_dataset(X, y):
zippded = list(zip(X, y))
np.random.shuffle(zipped)
X_result, y_result = zip(*zipped)
return np.asarray(X_result), np.asarray(y_result)