Keras输入输出形状异常:输入(120,3)报错、输出120个值如何解决
问题根源
- 输入维度适配问题:Keras模型默认要求输入的第一个维度为批量维度,你定义的
Input(shape=(120, 3))省略了批量维度,因此实际输入必须满足(批量大小, 120, 3)的形状,直接传入单样本的(120, 3)会因为缺维度报错。 - 结构设计问题:Dense层仅对张量的最后一个维度做计算,不会修改前面的维度,所以当前模型的输出形状为
(批量大小, 120, 1),每个样本会返回120个对应每个序列位置的输出,不符合你要单个预测值的需求。
调整方案
1. 修改模型结构,实现单样本输出单个预测值
在两个Dense层之间加一层Flatten()或者GlobalAveragePooling1D()来消去120的序列维度即可:
model = keras.Sequential([ keras.Input(shape=(120, 3)), layers.Dense(20, activation='relu'), # 新增层消去序列维度,二选一即可 layers.Flatten(), # 直接展平所有序列特征,保留全部信息 # layers.GlobalAveragePooling1D(), # 对序列维度做全局平均聚合,参数更少、抗过拟合性更好 layers.Dense(1, activation='sigmoid'), ])
修改后模型的输出形状为(批量大小, 1),单样本输入(1,120,3)就会返回单个预测值。
2. 单样本推理
调整结构后,把原始输入(120,3)加一个批量维度即可正常推理,两种写法都可以:
# 写法1:直接封装为数组 input = np.array([original_input]) # 形状变为(1,120,3) pred = model.predict(input)[0] # 取第一个元素即为单个预测值 # 写法2:用扩展维度API input = np.expand_dims(original_input, axis=0)
3. 批量推理
如果你有N个形状为(120,3)的样本,直接把它们堆叠成形状为(N, 120, 3)的张量输入模型即可,输出会是(N,1)的数组,每个元素对应一个样本的预测值:
# 假设samples是样本列表,每个元素都是(120,3)的数组 batch_input = np.stack(samples, axis=0) # 形状变为(N,120,3) preds = model.predict(batch_input) # 输出形状(N,1)
内容的提问来源于stack exchange,提问作者viraptor
相关产品推荐
相关产品推荐

