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

使用GridSearch与KerasClassifier调优LSTM时遇输出未定义错误

解决Scikeras KerasClassifier + GridSearch调优LSTM时的"无定义输出"错误

问题原因

  1. Scikeras API变更:build_fn已被标记为过时,新版本需改用model参数传递模型构建函数;手动指定n_outputs_expected_属于内部属性操作,会干扰Scikeras的自动推断逻辑。
  2. 模型初始化逻辑冲突:GridSearch在验证参数时会提前尝试初始化模型,错误的参数传递方式导致模型未正确完成构建流程,触发输出未定义的报错。

修复方案

以下是修改后的完整代码,关键调整点已标注:

!pip install scikeras
from sklearn.model_selection import GridSearchCV
from scikeras.wrappers import KerasClassifier

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense, Dropout
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences

# 调整模型构建函数:添加默认参数,适配GridSearch参数传递逻辑
def create_model(units=50, dropout=0.1, optimizer='adam'):
    model = Sequential()
    # 移除废弃的input_length参数,Keras会自动推断输入形状
    model.add(Embedding(5000, 128))
    model.add(LSTM(units))
    model.add(Dropout(dropout))
    # 多分类输出层保持不变
    model.add(Dense(3, activation='softmax'))
    model.compile(loss='sparse_categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
    return model

param_grid = {
    # 参数命名保持model__前缀,对应KerasClassifier的model参数
    'model__units': [50, 100, 150],
    'model__dropout': [0.1, 0.2, 0.3, 0.4],
    'model__optimizer': ['adam', 'rmsprop'],
    'epochs': [10, 20, 30],
    'batch_size': [32, 64, 128]
}

# 关键修改:用model参数替代build_fn,移除n_outputs_expected_
grid_search_model = KerasClassifier(model=create_model, error_score='raise')
grid_search = GridSearchCV(estimator=grid_search_model, param_grid=param_grid, cv=3)
grid_result = grid_search.fit(X_train_tf, label_encoded_y_train)

核心修改说明

  • API适配:将build_fn=create_model改为model=create_model,适配Scikeras最新版本要求,避免过时警告和逻辑冲突。
  • 移除内部属性:删除n_outputs_expected_=3,Scikeras会根据模型输出层和损失函数自动推断输出数量,手动设置会破坏内部流程。
  • 废弃参数清理:移除Embedding层的input_length参数,Keras现在会根据输入数据自动推断序列长度,该参数已被官方标记为废弃。
  • 默认参数设置:给模型构建函数的参数添加默认值,确保GridSearch在遍历参数前能正确初始化模型。

额外注意事项

  • 确保X_train_tf是经过padding处理的二维张量(形状为(样本数, 序列长度)),否则Embedding层可能无法正确推断输入形状。
  • 如果仍有报错,可尝试在模型构建时显式指定输入形状:model.add(Embedding(5000, 128, input_shape=(X_train_tf.shape[1],))),强制固定输入序列长度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:01:20