使用scikeras.wrappers.KerasRegressor调用cross_val_score时出现AttributeError错误
问题原因
你这段代码的核心问题是提前手动编译了Keras模型,再传给KerasRegressor。Scikeras的KerasRegressor会自动处理模型的构建与编译流程,提前编译会导致优化器对象状态异常,触发'Adam' object has no attribute 'build'错误。另外代码里用了plt但没导入matplotlib.pyplot,运行时也会报错。
修正后的代码
from tensorflow import keras from sklearn.model_selection import cross_val_score from sklearn.datasets import make_regression from scikeras.wrappers import KerasRegressor import matplotlib.pyplot as plt # 补上缺失的导入 def build_model(input_shape): model = keras.Sequential([ keras.layers.Dense(100, activation='relu', input_dim=input_shape), keras.layers.Dense(200, activation='relu'), keras.layers.Dense(200, activation='relu'), keras.layers.Dense(1, activation='linear') ]) model.compile(optimizer=keras.optimizers.Adam(), loss='mse') return model X, y = make_regression(n_samples=10_000) input_shape = X.shape[1] # 传入模型构建函数,而非预编译好的模型 model = KerasRegressor(model=build_model, model__input_shape=input_shape, batch_size=256, verbose=1, epochs=10) val_score = cross_val_score(model, X, y, cv=5) plt.plot(val_score) plt.show() # 加上显示图像的代码
另一种写法(在KerasRegressor中指定编译参数)
如果不想在构建函数里编译,也可以把优化器、损失等作为参数传给KerasRegressor:
from tensorflow import keras from sklearn.model_selection import cross_val_score from sklearn.datasets import make_regression from scikeras.wrappers import KerasRegressor import matplotlib.pyplot as plt def build_model(input_shape): return keras.Sequential([ keras.layers.Dense(100, activation='relu', input_dim=input_shape), keras.layers.Dense(200, activation='relu'), keras.layers.Dense(200, activation='relu'), keras.layers.Dense(1, activation='linear') ]) X, y = make_regression(n_samples=10_000) input_shape = X.shape[1] model = KerasRegressor(model=build_model, model__input_shape=input_shape, optimizer=keras.optimizers.Adam(), loss='mse', batch_size=256, verbose=1, epochs=10) val_score = cross_val_score(model, X, y, cv=5) plt.plot(val_score) plt.show()
内容的提问来源于stack exchange,提问作者fares rs
相关产品推荐
相关产品推荐

