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

Keras前馈神经网络最后一层输入单变量报错,多列正常的原因?

问题根源:Input层的shape参数误用

你遇到的问题核心是错误地将包含样本数量的完整DataFrame形状传给了Keras Input层的shape参数,而不是指定单个样本的特征维度。

为什么单列输入会报错?

当single_feature_x是单列DataFrame时,它的shape是(150, 1)(150个样本,1个特征)。你直接把这个元组传给Input(shape=single_feature_x.shape),这会让Keras误解为:每个输入样本是一个150行×1列的二维张量。加上batch维度后,single_input_x的实际输入形状就变成了[?, 1, 1](三维张量)。

而另一边,input_x对应的feature_x是3列,shape=(150,3),经过Dense(4)层处理后,输出是[?,4](二维张量)。当你尝试在axis=-1(最后一个维度)拼接这两个张量时,三维和二维张量的维度不匹配,自然就抛出了shape错误。

为什么加一列后能运行?

当你给single_feature_x添加一列常数后,它的shape变成了(150,2),传给Input层后,single_input_x的输入形状变成了[?,150,2](三维张量)。此时input_x经过Dense层后的输出是[?,150,4](同样是三维张量),两者的维度匹配,所以可以成功拼接。

但要注意:这只是“碰巧”能运行,实际上你的模型结构已经偏离了原本的意图——你原本想处理的是表格数据(每个样本是一维特征向量),但现在模型把每个样本当成了150个时间步/空间维度的序列数据,这完全不符合你的数据逻辑。

正确的解决方法

Input层的shape参数应该指定单个样本的特征维度(不包含batch数量),也就是取DataFrame的列数:

# 修正Input层的shape参数,只取特征列数
input_x = Input(shape=(feature_x.shape[1],), name='feature_input')
single_input_x = Input(shape=(single_feature_x.shape[1],), name='single_input')

这样修改后:

  • input_x的输入形状是[?,3](batch_size个样本,每个样本3个特征),经过Dense(4)后输出[?,4]
  • single_input_x的输入形状是[?,1],两者都是二维张量,在axis=-1拼接后得到[?,5],完全符合前馈神经网络的输入要求,不管是单列还是多列特征都能正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:42:38