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

使用Keras函数式API构建多输入模型时遇数据适配器错误

多输入Keras模型训练报错:ValueError数据适配器问题

使用Keras函数式API构建图像+表格元数据的多输入模型时,调用model.fit()出现以下错误:

ValueError: Failed to find data adapter that can handle input: (<class 'list'> containing values of types {"<class 'tensorflow.python.data.ops.dataset_ops.PrefetchDataset'>", "<class 'tensorflow.python.data.ops.dataset_ops.TakeDataset'>"}), <class 'NoneType'>

单独训练CNN图像模型或元数据模型均正常,多输入场景报错的核心原因是两个输入数据集的输出结构不匹配:图像数据集返回(图像张量, 标签),元数据数据集返回({特征字典}, 标签),Keras无法自动对齐两组标签,导致数据适配失败。


解决方案

1. 统一数据集输出结构

将两个数据集的输出格式调整为一致的(输入列表, 标签)结构,其中输入列表对应模型的两个输入分支。

调整图像数据集(仅保留图像张量)

# 去掉图像数据集中的标签,只保留图像张量
cnn_train = cnn_train.map(lambda x, y: x)
cnn_val = cnn_val.map(lambda x, y: x)

合并图像与元数据数据集

使用tf.data.Dataset.zip将两个数据集按样本一一对应合并,统一输出模型需要的输入结构:

# 合并训练集:([图像张量, 元数据特征字典], 标签)
train_ds = tf.data.Dataset.zip((cnn_train, meta_train_ds)).map(
    lambda img, (meta_dict, label): ([img, meta_dict], label)
)

# 合并验证集
val_ds = tf.data.Dataset.zip((cnn_val, meta_val_ds)).map(
    lambda img, (meta_dict, label): ([img, meta_dict], label)
)

2. 修改model.fit调用

直接传入合并后的完整数据集,无需再单独传递多输入列表:

model.fit(train_ds, validation_data=val_ds, epochs=10)

3. 关键注意事项

  • 样本顺序匹配:确保图像数据集和元数据数据集的样本数量、顺序完全对应,避免合并后标签错位。可通过文件名/样本ID关联两组数据。
  • batch_size统一:检查image_dataset_from_directory和df_to_dataset中的batch_size参数是否一致,否则会出现batch不匹配问题。
  • 标签一致性:确认图像数据集的标签与元数据的target列完全一致,避免训练时标签冲突。

内容的提问来源于stack exchange,提问作者bilbo_slagins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:35:45