Keras前馈神经网络最后一层输入单变量报错,多列正常的原因?
你遇到的问题核心是错误地将包含样本数量的完整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

