将TensorFlow数据集拆分为训练/验证/测试集会导致数据泄露吗?
关于TensorFlow数据集拆分与数据泄露的问题
你的判断有一定道理,但得结合具体情况来看:
- 核心关键点在于
shuffle=True是否搭配了固定的seed参数:- 如果没指定seed,每次对数据集
ds发起新的遍历(比如调用take、skip),都会重新生成随机打乱的顺序。这时候train_ds = ds.take(8)是第一次打乱后的前8个batch,val_ds = ds.skip(8).take(1)是第二次重新打乱后的第9个batch,test_ds则是第三次打乱后的后续内容——三个数据集必然会出现数据重叠,也就是训练集的数据出现在验证/测试集里,确实存在数据泄露。 - 如果创建数据集时给
shuffle=True搭配了固定seed(比如shuffle=True, seed=42),每次遍历ds时的打乱顺序会完全固定。这时候take和skip都是基于同一个固定打乱后的序列,三个数据集的batch不会重叠,也就不存在数据泄露。
- 如果没指定seed,每次对数据集
不过更稳妥的拆分方式是先固定基础数据集的顺序,再拆分并按需打乱:
ds = tf.keras.preprocessing.image_dataset_from_directory('/content/data', labels='inferred', label_mode='int', batch_size=32, image_size=(256, 256), shuffle=False) # 按8:1:1比例拆分 train_size = int(0.8 * len(ds)) val_size = int(0.1 * len(ds)) test_size = len(ds) - train_size - val_size train_ds = ds.take(train_size).shuffle(1000, seed=42) val_ds = ds.skip(train_size).take(val_size) test_ds = ds.skip(train_size + val_size)
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

