运行Keras深度学习模型报ValueError:输入数据格式不符合要求
报错根因定位
该报错由Keras接口输入数据格式不符合规范触发,具体逻辑如下:
- 报错触发点是Keras内部的
unpack_x_y_sample_weight数据解析函数,该函数仅支持识别4种合法输入格式:单输入数组x、仅含输入的单元素元组(x,)、输入+标签对(x,y)、输入+标签+样本权重三元组(x,y,sample_weight),超出该结构的输入都会直接抛出你看到的ValueError。 - 结合你给出的
data_params配置,你的输入包含5种不同模态的特征:local_box、local_surround、pose、box、speed,对应单样本维度分别为(15,512)、(15,512)、(15,36)、(15,4)、(15,1)。 - 你当前直接传入
test_data['data'][0]的本质是包含5个numpy数组的元组,Keras解析时会默认按(x,y,sample_weight,...)的固定结构拆解,读到第4个元素时就会判定格式非法。 - 训练阶段未提前报错的原因大概率是
self._generator分支或validation_data的传参刚好走了生成器数据适配逻辑,没有触发该格式校验分支,预测阶段直接传裸元组就触发了报错。
修复方案
根据你模型的输入结构二选一调整即可:
场景1:模型为单输入结构(5种特征提前融合为单个输入张量)
提前将5个模态的特征按指定维度拼接为单个numpy数组,再传入接口,禁止直接传包含多个数组的元组。
参考代码:
import numpy as np # 按实际特征融合的维度调整axis参数,时序特征一般在最后一维拼接 x_test = np.concatenate(test_data['data'][0], axis=-1) test_results = test_model.predict(x_test, batch_size=8, verbose=1) # 训练、验证集做相同格式处理 x_train = np.concatenate(data_train['data'][0], axis=-1) y_train = None if self._generator else data_train['data'][1] x_val = np.concatenate(data_val[0], axis=-1) y_val = data_val[1] history = train_model.fit( x=x_train, y=y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_val, y_val), class_weight=class_w, verbose=1, callbacks=callbacks )
场景2:模型为多输入结构(建模时为5个模态分别定义了独立Input层)
将多输入特征从元组转为列表传入,Keras多输入场景要求用列表按Input层定义顺序传入对应数组。
参考代码:
# 元组转列表后传入 x_test = list(test_data['data'][0]) test_results = test_model.predict(x_test, batch_size=8, verbose=1) # 验证集同步调整格式 x_val = list(data_val[0]) y_val = data_val[1] history = train_model.fit( x=list(data_train['data'][0]), y=None if self._generator else data_train['data'][1], batch_size=batch_size, epochs=epochs, validation_data=(x_val, y_val), class_weight=class_w, verbose=1, callbacks=callbacks )
校验步骤
修改后先做格式校验再启动训练/推理:
- 单输入场景:确认传入接口的是单个numpy数组,shape与模型输入层定义完全匹配
- 多输入场景:确认传入的是长度等于模型输入层数量的列表,列表内每个数组的shape与对应顺序的Input层匹配
注意:Keras的fit/predict/evaluate接口对元组类型输入有特殊解析逻辑,永远不要把多输入数组直接放在裸元组里传入,否则一定会被误识别为(x,y,sample_weight)结构触发格式错误。
内容的提问来源于stack exchange,提问作者Lolo
相关产品推荐
相关产品推荐

