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

使用cross_val_score计算CNN模型交叉验证得分时遇TypeError问题求助

解决Keras CNN模型cross_val_score报错问题

问题场景

构建的CNN模型代码如下:

model_cnn = Sequential()
model_cnn.add(Convolution1D(filters=32,kernel_size=2, strides=1, activation='relu', input_shape=(x_train.shape[1], 1)))
model_cnn.add(MaxPooling1D())
model_cnn.add(Flatten())
model_cnn.add(Dense(105))
model_cnn.add(Dropout(0.5))
model_cnn.add(Dense(1, activation="relu"))
model_cnn.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model_cnn.summary()
x_train = x_train.todense()
x_test = x_test.todense()
x_train = np.expand_dims(x_train, axis=-1)
x_test = np.expand_dims(x_test, axis=-1)
history_cnn = model_cnn.fit(x_train, y_train,validation_data=(x_test, y_test), epochs=3)

执行交叉验证代码时:

print("Mean of Cross validation score(CNN): ", cross_val_score(model_cnn, x_train, y_train, cv=kfold).mean())

出现错误:

TypeError: If no scoring is specified, the estimator passed should have a 'score' method. The estimator <keras.engine.sequential.Sequential object at 0x00000154DF44B6A0> does not.

解决方案

方法1:给cross_val_score指定scoring参数

Keras的Sequential模型没有默认的score方法,需显式指定评估指标。针对二分类任务,直接指定scoring='accuracy'即可:

print("Mean of Cross validation score(CNN): ", cross_val_score(model_cnn, x_train, y_train, cv=kfold, scoring='accuracy').mean())

方法2:用KerasClassifier包装模型

将Keras模型包装为适配scikit-learn接口的KerasClassifier,让模型自动拥有score方法,步骤如下:

  1. 导入依赖:
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier
  1. 定义模型构建函数:
def build_cnn_model():
    model = Sequential()
    model.add(Convolution1D(filters=32,kernel_size=2, strides=1, activation='relu', input_shape=(x_train.shape[1], 1)))
    model.add(MaxPooling1D())
    model.add(Flatten())
    model.add(Dense(105))
    model.add(Dropout(0.5))
    model.add(Dense(1, activation="sigmoid"))  # 二分类任务建议用sigmoid替代relu
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model
  1. 包装模型并执行交叉验证:
model_cnn_wrap = KerasClassifier(build_fn=build_cnn_model, epochs=3, verbose=0)
print("Mean of Cross validation score(CNN): ", cross_val_score(model_cnn_wrap, x_train, y_train, cv=kfold).mean())

额外注意事项

原模型最后一层使用relu激活函数,但二分类任务搭配binary_crossentropy损失时,更适合用sigmoid激活——sigmoid输出范围为(0,1),对应概率值,能更好匹配损失函数的计算逻辑,提升模型效果与评估准确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:15:39