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

Keras多输入模型训练报错ValueError:无法识别数据类型

Keras多输入模型训练报错ValueError:无法识别数据类型

嘿,我看你遇到的问题很典型——Keras的fit方法没办法直接混合处理Pandas DataFrame和tf.data.Dataset这两种不同类型的输入,这就是报错的根源。咱们一步步来解决它:

问题出在哪?

你把Pandas特征表和批次化后的图像Dataset直接塞进列表传给x,Keras没法同时解析这两种不同的数据格式,自然就抛出"无法识别数据类型"的错误了。得把它们统一成同一种格式才行,这里有两种靠谱的解决方案:


方案一:统一用tf.data.Dataset处理(推荐,适合大数据量)

这种方法是把DataFrame也转成tf.data.Dataset,然后和图像Dataset合并成一个包含输入和目标的联合Dataset,流式处理不占内存。

  1. 把DataFrame转成Dataset
    先提取特征和目标,再转成Dataset并批次化(注意批次大小要和图像Dataset一致):

    import tensorflow as tf
    import numpy as np
    
    # 提取DataFrame的特征和目标
    df_features = df.loc[:, df.columns != 'target'].values
    df_target = df["target"].values
    
    # 转成tf.data.Dataset并批次化
    df_ds = tf.data.Dataset.from_tensor_slices((df_features, df_target))
    df_ds = df_ds.batch(8)  # 和图像Dataset的batch大小保持一致
    
  2. 合并两个Dataset
    用tf.data.Dataset.zip把图像Dataset和DataFrame的Dataset合并,再调整成模型需要的输入结构:

    # 定义一个映射函数,把两个Dataset的元素整合成模型需要的(输入, 目标)格式
    def combine_inputs(image_batch, feature_target_batch):
        features, target = feature_target_batch
        # 这里的输入要和你的模型输入层顺序对应,假设模型先接收图像输入,再接收特征输入
        return (image_batch, features), target
    
    # 合并两个Dataset并应用映射函数
    combined_ds = tf.data.Dataset.zip((ds.batch(8), df_ds)).map(combine_inputs)
    
  3. 用合并后的Dataset训练
    现在直接把combined_ds传给fit就行,不用再单独传x和y了:

    model.fit(combined_ds, epochs=200)
    

方案二:把Dataset转成NumPy数组(适合小数据量)

如果你的数据量不大,能一次性放进内存,可以把图像Dataset转成NumPy数组,再和DataFrame的数组一起传给fit:

  1. 提取图像Dataset的NumPy数组

    # 把批次化后的图像Dataset转成迭代器,提取所有批次
    image_batches = list(ds.batch(8).as_numpy_iterator())
    
    # 拼接所有批次的图像(根据你的报错,图像Dataset每个元素是两个张量,所以分别拼接)
    imgs_input1 = np.concatenate([batch[0] for batch in image_batches], axis=0)
    imgs_input2 = np.concatenate([batch[1] for batch in image_batches], axis=0)
    
  2. 把DataFrame转成NumPy数组

    df_array = df.loc[:, df.columns != 'target'].values
    target_array = df["target"].values
    
  3. 传入数组训练
    注意输入列表的顺序要和模型输入层的顺序对应:

    model.fit(
        x=[df_array, [imgs_input1, imgs_input2]],  # 这里要匹配你的模型输入结构
        y=target_array,
        epochs=200,
        batch_size=8
    )
    

额外提醒

  • 一定要确保图像数据和特征数据的样本数量完全一致,不然合并或训练时会出现维度不匹配的错误。
  • 检查你的模型输入层的形状是否和输入数据匹配:比如图像输入层要对应(32,256,256,3)的形状,特征输入层要对应52维的特征向量。

备注:内容来源于stack exchange,提问作者Harsha Addanki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 08:53:02