TensorFlow中shuffle后执行batch()仅返回单个批次的问题咨询
TensorFlow中shuffle后执行batch()仅返回单个批次的问题咨询
嗨,我来帮你拆解下这个问题的核心原因,其实是你在数据集处理流程里多做了一次不必要的batch()调用,导致了预期外的结果~
首先,你用image_dataset_from_directory创建训练集的时候,已经指定了batch_size=32,这时候返回的train_dataset已经是按32个样本为一批的数据集了。按你的总样本数496计算,训练集占80%约397个样本,所以初始的批次数量是13个(12个满32样本的批次,1个13样本的剩余批次)。
接下来对应你的几个观察点逐一解释:
- shuffle后显示13个批次:
shuffle()只是打乱现有批次的顺序,不会改变批次的数量,所以还是13个批次,这是正常的。 - 再次batch后只剩1个批次:你这里调用的
train_dataset.batch(batch_size=32),是把现有的每个批次当作单个元素,再打包成32个元素为一组的大批次。你的数据集只有13个原批次,远小于32,所以只能凑出1个包含所有13个原批次的大批次,这就是你看到“仅1个批次”的原因。 - drop_remainder=True时数据为空:当你设置
drop_remainder=True时,这个batch()会要求必须凑够32个原批次才能组成一个大批次,但你只有13个,达不到数量要求,所以整个数据集就被丢弃了,自然为空。
解决方案
你只需要去掉第二次的batch()调用就可以了,因为image_dataset_from_directory已经帮你完成了分批次的工作。如果需要丢弃剩余批次,直接在初始创建时设置参数即可:
image_size = (300, 300) batch_size = 32 train_dataset = image_dataset_from_directory( dataset_dir, image_size=(image_size[0], image_size[1]), batch_size=batch_size, label_mode="binary", validation_split=0.2, subset="training", seed=123, drop_remainder=True # 在这里设置丢弃剩余批次 ) train_dataset = train_dataset.shuffle(1000).prefetch(buffer_size=AUTOTUNE) print(train_dataset.cardinality().numpy()) # 这里会输出12,也就是12个满32样本的批次
如果确实需要先打乱单个样本再重新分批次(比如想保证shuffle是针对单个样本而不是批次),可以先把数据集拆成单个样本,再重新分批次:
train_dataset = image_dataset_from_directory( dataset_dir, image_size=(image_size[0], image_size[1]), batch_size=batch_size, label_mode="binary", validation_split=0.2, subset="training", seed=123, ) train_dataset = train_dataset.unbatch() # 拆成单个样本 train_dataset = train_dataset.shuffle(1000).batch(batch_size=batch_size, drop_remainder=True).prefetch(buffer_size=AUTOTUNE)
备注:内容来源于stack exchange,提问作者CChickii
相关产品推荐
相关产品推荐

