Keras拼接3个并行密集层时出现样本数不一致报错的问题求助
Keras拼接3个并行密集层时出现样本数不一致报错的问题求助
看起来你在构建多输入并行模型做分类时踩了数据维度匹配的坑,我来帮你捋清楚问题出在哪,以及怎么解决~
问题分析
你的需求很明确:处理形状为[10000, 3]的特征矩阵,把每一列作为独立输入,各自经过Dense层后拼接,最终输出12类的分类结果。但报错ValueError: Found input variables with inconsistent numbers of samples: [3, 10000],核心原因有两个:
- 特征拆分方式错误:你用
np.array_split(features.transpose(), num_features)处理数据,原特征是(10000,3),转置后变成(3,10000),按轴0拆分后得到3个(1,10000)的数组——这相当于把10000个样本变成了3个“样本”,和labels的10000个样本完全不匹配。 - Concatenate层调用错误:
Concatenate(hidden_layers)的写法不对,Keras的层需要先实例化再调用,应该是Concatenate()(hidden_layers)。
修正后的完整代码
import numpy as np from tensorflow.keras.layers import Input, Dense, Concatenate from tensorflow.keras.models import Model from tensorflow.keras.wrappers.scikit_learn import KerasClassifier num_features = 3 num_outputs = 12 def create_model(): # 每个输入对应1个特征,形状(1,) inputs = [Input(shape=(1,)) for i in range(num_features)] # 每个输入对应一个Dense隐藏层 hidden_layers = [Dense(8, activation='relu')(input_layer) for input_layer in inputs] # 正确调用Concatenate层:先实例化,再传入输入列表 concatenated = Concatenate()(hidden_layers) # 输出层:多分类用softmax output = Dense(num_outputs, activation='softmax')(concatenated) # 创建模型 model = Model(inputs=inputs, outputs=output) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) return model # 假设features是形状(10000,3)的特征矩阵,labels是对应标签 # 正确拆分特征:按列拆分,每个输入形状为(10000,1) split_features = [features[:, i:i+1] for i in range(num_features)] # 创建KerasClassifier并训练 keras_classifier = KerasClassifier(model=create_model, verbose=0) keras_classifier.fit(split_features, labels, verbose=0)
关键修正点说明
- 特征拆分:用
features[:, i:i+1]按列提取特征,得到的每个数组形状是(10000,1),刚好对应模型每个输入层的要求——10000个样本,每个样本1个特征,和labels的样本数完全匹配。 - Concatenate层:
Concatenate()先创建层实例,再传入hidden_layers列表,这样才能正确把三个(10000,8)的张量拼接成(10000,24)的张量,供后续输出层使用。
备注:内容来源于stack exchange,提问作者Nikki Mino
相关产品推荐
相关产品推荐

