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

Keras:使用Sequential与Model构建的模型为何输出不同?

为什么Keras Sequential API和Model API构建的模型输出不同?

嘿,这个问题问得很到位!其实这两种API本身不会导致模型输出不同——除非你的代码里有细节没对齐,或者Model API的实现有遗漏/错误。咱们一步步拆解可能的原因:

1. 代码里的明显错误或遗漏

先看你贴的Sequential代码,最后一行的Dense层有语法错误:

# 错误写法
model.add(Dense(len(7, activation='softmax'))
# 正确应该是(假设分类类别数是7)
model.add(Dense(7, activation='softmax'))

如果你的Model API代码里写对了这个参数,那两个模型的结构已经不一样了,输出自然不同。

另外你贴的Model API代码没写完:inputs = Input(shape=(27 , 300)... 后面的层堆叠完全缺失。如果Model API的模型少加了某一层(比如漏了MaxPooling1D),或者层参数和Sequential不匹配(比如LSTM单元数改成了80),那输出肯定不一样。

2. 权重初始化的随机性

即使两个模型的结构完全一致,Keras在初始化层权重的时候是随机的(除非手动固定随机种子)。所以两次不同的模型初始化——不管用哪种API——在相同输入下的初始输出也会不一样。

如果要验证结构是否真的一致,可以这么做:

  • 先固定随机种子:
    import tensorflow as tf
    import numpy as np
    tf.random.set_seed(42)
    np.random.seed(42)
    
  • 然后把其中一个模型的权重复制到另一个:
    # 假设model1是Sequential模型,model2是Model API模型
    model2.set_weights(model1.get_weights())
    
    这时候再喂相同的输入,两个模型的输出应该完全一致。

3. Model API的实现细节偏差

假设你完整实现了Model API的模型,一定要确保每一层的参数和Sequential完全对应。比如和你的Sequential代码匹配的正确Model API实现应该是这样:

# 正确的Model API实现(和Sequential结构完全对齐)
inputs = Input(shape=(27, 300))
x = Conv1D(filters=32, kernel_size=3, padding='same', activation='relu')(inputs)
x = MaxPooling1D(pool_size=2)(x)
x = LSTM(100)(x)
outputs = Dense(7, activation='softmax')(x)
model = Model(inputs=inputs, outputs=outputs)
model.summary()

你可以对比这个代码和你的Model API实现,只要每一层的参数(filters、pool_size、单元数等)完全一致,再加上固定随机种子,输出就会相同。

4. 输入处理的细微差别

有时候可能不小心给两个模型喂了不同的输入数据(比如一个做了归一化另一个没做),或者输入的维度顺序搞错了?不过从你的input_shape=(27,300)来看,只要输入数据形状匹配,这块应该不会有问题。


内容的提问来源于stack exchange,提问作者Clement Viricel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:13:49