Keras Tuner使用DirectoryIterator时validation_split报错咨询
报错核心原因
validation_split 参数仅支持从静态加载到内存的张量、NumPy数组数据中随机切分验证集,无法对动态流式读取磁盘数据的DirectoryIterator对象做自动拆分。这类图像生成器是逐批次从硬盘加载图片的,没有一次性把全量数据读入内存,完全不满足自动切分的前置条件。
从你现有代码的目录结构看,你已经单独划分了Data/Train训练目录、Data/Val验证目录,本来就有独立的验证数据集,根本不需要依赖validation_split做自动切分。
具体修改步骤
1. 修正Keras Tuner超参搜索的调用逻辑
你当前错误地给传入训练生成器的search方法加了validation_split=0.2参数,直接删掉这个无效参数,把已经初始化好的独立验证生成器test_data_gen通过validation_data参数传入,替换原有的搜索代码为:
tuner.search( train_data_gen, epochs=50, validation_data=test_data_gen, validation_steps=10, # 和后续普通训练的验证步数对齐,避免拖慢搜索速度 callbacks=[stop_early] )
2. 修正最终模型训练的调用逻辑
你后续调用model.fit训练最终模型时,同样错误添加了validation_split=0.2参数,直接删除该参数,沿用独立验证生成器即可,替换为你之前注释掉的正确写法:
history = model.fit( train_data_gen, steps_per_epoch=steps_per_epoch, epochs=epochs, validation_data=test_data_gen, validation_steps=10, callbacks=[cp_callback, tensorboard_callback] )
代码附带的必踩坑提醒
- 模型编译阶段,你设置的损失函数为
SparseCategoricalCrossentropy(from_logits=True),但模型最后一层已经加了softmax激活,这种场景下必须把from_logits设为False,否则会出现损失值异常、计算准确率不准的问题。 - 模型第一个卷积层设置的265个卷积核不属于常规显存优化配置,超参搜索阶段容易出现显存溢出,建议调整为128或256这类标准数值。
- 因为训练数据集体量较大,调用
tuner.search时最好和后续训练保持一致,加上steps_per_epoch=steps_per_epoch参数,避免默认跑全量训练集导致搜索速度过慢。
内容的提问来源于stack exchange,提问作者DragonflyRobotics
相关产品推荐
相关产品推荐

