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

运行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:06:19