You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 08:24:01