Keras多输入模型训练报错ValueError:无法识别数据类型
Keras多输入模型训练报错ValueError:无法识别数据类型
嘿,我看你遇到的问题很典型——Keras的fit方法没办法直接混合处理Pandas DataFrame和tf.data.Dataset这两种不同类型的输入,这就是报错的根源。咱们一步步来解决它:
问题出在哪?
你把Pandas特征表和批次化后的图像Dataset直接塞进列表传给x,Keras没法同时解析这两种不同的数据格式,自然就抛出"无法识别数据类型"的错误了。得把它们统一成同一种格式才行,这里有两种靠谱的解决方案:
方案一:统一用tf.data.Dataset处理(推荐,适合大数据量)
这种方法是把DataFrame也转成tf.data.Dataset,然后和图像Dataset合并成一个包含输入和目标的联合Dataset,流式处理不占内存。
把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大小保持一致合并两个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)用合并后的Dataset训练
现在直接把combined_ds传给fit就行,不用再单独传x和y了:model.fit(combined_ds, epochs=200)
方案二:把Dataset转成NumPy数组(适合小数据量)
如果你的数据量不大,能一次性放进内存,可以把图像Dataset转成NumPy数组,再和DataFrame的数组一起传给fit:
提取图像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)把DataFrame转成NumPy数组
df_array = df.loc[:, df.columns != 'target'].values target_array = df["target"].values传入数组训练
注意输入列表的顺序要和模型输入层的顺序对应: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
相关产品推荐
相关产品推荐

