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

使用KerasClassifier封装模型报错:Sequential模型未定义输出,求解决方案

问题原因分析

这个错误的核心是你的Keras Sequential模型处于未构建状态,导致Scikeras在验证模型兼容性时无法获取模型输出。具体原因有两点:

  1. 你的模型依赖硬编码的X_train.shape[1]作为Embedding层的input_length,但Scikeras的KerasClassifier在初始化阶段(还未执行fit)不会传入实际数据触发模型构建,模型始终处于"未初始化"状态(从summary里的0 (unbuilt)参数也能看出)。
  2. 新版Keras(3.x及以上)对模型构建的要求更严格,必须显式指定输入形状或通过数据触发构建,旧版本自动构建的逻辑已被调整。
修复方案

以下三种方案任选其一即可:

方案一:让模型接收动态输入形状参数(推荐)

修改模型创建函数,让Scikeras自动传递输入形状,避免硬编码依赖全局变量:

def create_model(embed_dim=16, hidden_unit=16, dropout_rate=0.2, optimizers=Adam, learning_rate=0.001, input_shape=None):
    model = Sequential()
    # 从参数获取输入长度,替代硬编码的X_train.shape[1]
    model.add(Embedding(input_dim=max_features, output_dim=embed_dim, input_length=input_shape[0]))
    model.add(LSTM(units=hidden_unit, activation='tanh'))
    model.add(Dropout(dropout_rate))
    model.add(Dense(units=3, activation='softmax'))
    model.compile(loss='sparse_categorical_crossentropy', optimizer=optimizers(learning_rate=learning_rate), metrics=['accuracy'])
    print(model.summary())
    return model

封装代码无需修改,Scikeras会自动根据X_train的形状传递input_shape参数:

model = KerasClassifier(model=create_model,
                        dropout_rate=0.2,
                        embed_dim=32,
                        hidden_unit=16,
                        optimizers=Adam,
                        learning_rate=0.001,
                        epochs=25,
                        batch_size=128,
                        validation_split=0.1)
model_prediction = model.fit(X_train, y_train)

方案二:显式构建模型

在模型创建后手动调用build方法,强制完成模型初始化:

def create_model(embed_dim=16, hidden_unit=16, dropout_rate=0.2, optimizers=Adam, learning_rate=0.001):
    model = Sequential()
    model.add(Embedding(input_dim=max_features, output_dim=embed_dim, input_length=X_train.shape[1]))
    model.add(LSTM(units=hidden_unit, activation='tanh'))
    model.add(Dropout(dropout_rate))
    model.add(Dense(units=3, activation='softmax'))
    # 显式指定输入形状,触发模型构建
    model.build((None, X_train.shape[1]))
    model.compile(loss='sparse_categorical_crossentropy', optimizer=optimizers(learning_rate=learning_rate), metrics=['accuracy'])
    print(model.summary())
    return model

方案三:改用函数式API定义模型

函数式API会明确定义输入输出,从根源避免未构建问题:

def create_model(embed_dim=16, hidden_unit=16, dropout_rate=0.2, optimizers=Adam, learning_rate=0.001):
    inputs = Input(shape=(X_train.shape[1],))
    x = Embedding(input_dim=max_features, output_dim=embed_dim)(inputs)
    x = LSTM(units=hidden_unit, activation='tanh')(x)
    x = Dropout(dropout_rate)(x)
    outputs = Dense(units=3, activation='softmax')(x)
    model = Model(inputs=inputs, outputs=outputs)
    model.compile(loss='sparse_categorical_crossentropy', optimizer=optimizers(learning_rate=learning_rate), metrics=['accuracy'])
    print(model.summary())
    return model
额外注意事项
  • 确保max_features是已提前定义的有效变量,最好也将其作为参数传入create_model,避免依赖全局变量的潜在问题。
  • 同步升级Scikeras到最新版本以兼容Keras 3.x:pip install --upgrade scikeras

内容的提问来源于stack exchange,提问作者Faisal Syahruddin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:35:12