使用GridSearch.fit时出现'Sequential'对象无'compiled'属性错误
问题解决:AttributeError: 'Sequential' object has no attribute 'compiled'
核心原因
这个错误源于Scikeras工作流程与手动编译模型的操作冲突,且版本兼容性存在问题:
- 你在自定义模型函数
create_model中手动调用cnn.compile(),但Scikeras的KerasClassifier会自行管理模型编译流程,重复编译触发内部检查错误。 - 旧版Scikeras会尝试检查模型的
compiled属性,但TensorFlow Keras的Sequential对象并没有该属性,直接导致属性错误。
分步解决方案
1. 修改模型构建函数:移除手动编译
将模型构建与编译分离,仅在函数中返回未编译的模型,交给Scikeras负责编译环节:
def create_model(neurons_1, neurons_2, dropout): # 构建Sequential模型 cnn = models.Sequential([ layers.Conv1D(filters=neurons_1, kernel_size=8, activation='relu', input_shape=(82,1)), layers.MaxPooling1D(4), layers.BatchNormalization(), layers.Conv1D(filters=neurons_2, kernel_size=8, activation='relu'), layers.MaxPooling1D(4), layers.BatchNormalization(), layers.Flatten(), layers.Dense(100, activation='relu'), layers.Dropout(dropout), layers.Dense(50, activation='relu'), layers.Dropout(dropout), layers.Dense(2, activation='softmax') ]) # 移除手动编译代码,交给Scikeras处理 return cnn
2. 调整KerasClassifier初始化与超参数网格
- 在
KerasClassifier中指定编译所需的损失函数、评估指标。 - 优化器的学习率需通过
optimizer__learning_rate传递(属于Scikeras的编译参数,而非模型参数):
# 用KerasClassifier包装模型,指定编译参数 model = KerasClassifier( model=create_model, loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=['accuracy'] ) # 修正超参数网格的参数路径 params={ 'epochs':[20,50,100], 'model__neurons_1':[16,32,64,128], 'model__neurons_2':[16,32,64,128], 'optimizer':['adam','sgd'], # 使用小写sgd,匹配Scikeras的标准命名 'optimizer__learning_rate':[0.001, 0.01, 0.1], # 优化器参数前缀为optimizer__ 'model__dropout':[0.2,0.5] }
3. 修正输入数据形状
Conv1D要求输入为3D张量(样本数, 时间步长, 特征数),需给标准化后的数据增加一个维度:
# 数据标准化后增加维度,匹配input_shape=(82,1) transformer = RobustScaler().fit(X_val) X_r_scaled = transformer.transform(X_val) X_r_scaled = X_r_scaled.reshape(X_r_scaled.shape[0], X_r_scaled.shape[1], 1)
4. 升级Scikeras解决版本兼容
若上述调整后仍有问题,升级Scikeras到最新版本,修复API兼容性问题:
pip install --upgrade scikeras
最终执行流程
完成上述修改后,重新运行网格搜索代码即可正常执行。
内容的提问来源于stack exchange,提问作者D.S. Parihar
相关产品推荐
相关产品推荐

