あるデータセットがあり,それをtrainデータとvalidationデータに分けたかった
master_ds = tf.data.Dataset.from_tensor_slices([i for i in range(10000)]).shuffle(10000)
train_ds = master_ds.take(6000)
valid_ds = master_ds.skip(6000).take(4000)
master_ds
は今回考える10000件のデータ.そのまま拾ってくると綺麗にソートされているので先頭5000件と,飛ばして5000件とするとラベルが非常に偏る
そのため1度シャッフルする必要がある
次に先頭から6000件,4000件と取得する.
train_val = [v for v in train_ds]
valid_val = [v for v in valid_ds]
for v in valid_val:
if v in train_val:
print(v)
train_ds
とvalid_ds
を配列に直し,train_val
とvalid_val
とした(名前良くないね)
ここでvalid_val
の要素がtrain_val
に入っていればリークが発生していることになる
実際に実行すると,いくつか出力されることが過確認できる
tf.data.Dataset
になる前にマスターの要素をshuffle
しておく
import random
x = [i for i in range(10000)]
random.shuffle(x)
master_ds = tf.data.Dataset.from_tensor_slices(x)
これが可能であれば,最初からシャッフルした状態で使える
def is_test(i, x):
return (i % 2) == 0
def is_train(i, x):
return not is_test(i, x)
def restore(i, x):
return x
train = master.enumrate().filter(is_train).map(restore)
test = master.enumrate().filter(is_test).map(restore)
こういう方法も考えられる
やや柔軟性が欠けているかもしれない