KerasProgsor无法克隆对象-不知道为什么会引发此错误



我正在用scikit学习包装器构建一个基本的Keras模型,这样我就可以进行随机跨值搜索来优化参数。代码如下:

def build_model(n_hidden=1, n_neurons=30, learning_rate=3e-3, input_shape=[8]):
model = models.Sequential()
model.add(layers.InputLayer(input_shape=input_shape))
for layer in range(n_hidden):
model.add(layers.Dense(n_neurons, activation="relu"))
model.add(layers.Dense(1))
optimizer = optimizers.SGD(lr=learning_rate)
model.compile(loss="mse", optimizer=optimizer)
return model
keras_reg = wrappers.scikit_learn.KerasRegressor(build_fn=build_model)
keras_reg.fit(X_train, y_train, epochs=100, validation_data=(X_valid, y_valid), callbacks= 
[callbacks.EarlyStopping(patience=10)])
mse_test = keras_reg.score(X_test, y_test)
y_pred = keras_reg.predict(X_new)
from scipy.stats import reciprocal
from sklearn.model_selection import RandomizedSearchCV
param_distribs = {
"n_hidden": [0, 1, 2, 3],
"n_neurons": (np.arange(1,100)),
"learning_rate": (reciprocal(3e-4, 3e-2))
}
rnd_search_cv = RandomizedSearchCV(keras_reg, param_distribs, n_iter=10, cv=3)
rnd_search_cv.fit(X_train, y_train, epochs=100, validation_data=(X_valid, y_valid), callbacks= 
[callbacks.EarlyStopping(patience=10)])

我在最后一行得到错误:

追踪(最近一次通话(:文件";ml_hyperparams.py";,第49行,inrnd_search_cv.fit(X_train,y_train,历元=100,validation_data=(X_valid,y_validate(,callbacks=[callbacks.EarlyStoping(耐心=10(](

文件";C: \Users\Jesus\AppData\Roaming\Python\Python37\site-packages\sklearn\model_selection_search.py";,线736,配合**self.best_params_((文件";C: \Users\AppData\Roaming\Python\Python37\site-packages\sklearn\base.py";,第82行,克隆(估计器,名称(

RuntimeError:无法克隆对象<位于0x0000015C3CBCDB88>的tensorflow.python.keras.wrappers.scikit_earn.KerasProgsor对象;,因为构造函数没有设置或修改参数learning_rate

我在某个地方读到,当params-dict有嵌套列表时,通常会发生这种情况,并且可以使用元组(因此使用括号(来修复它,但显然这不起作用。最不寻常的是,我逐字逐句地复制了Aurélien Géron的";Hands-On Machine Learning;所以我不知道为什么会出现这个错误。感谢您的帮助!

Tipically的人说使用列表和元组而不是numpy数组,但不幸的是,它并不能完全解决问题。这是Kera的scikit学习包装器中的一个问题,可以通过以下方式轻松解决:

  1. 查找tensorflow的文件夹安装和文件tensorflow\python\keras\wrappers\scikit_learn.py

  2. 编辑第117行中的文件:

删除:res = copy.deepcopy(self.sk_params)

添加:res = self.sk_params.copy()

它基本上是从深度复制转换为浅层复制。它在这里工作得很好。最初的解决方案在这里(Tensorflow项目中合并了一个pull(

向致以最良好的问候

最新更新