在TF 2.0中使用RandomizedSearchCV搜索参数时,为什么会出现错误?

2024-05-16 00:35:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码就是这样,我尝试在TF2.0中使用KerasRegressionrAPI搜索参数

def build_model(hidden_layers = 1,
                layer_size = 30,
                learning_rate = 3e-3):
    model = keras.models.Sequential()
    model.add(keras.layers.Dense(layer_size, activation='relu',
                                 input_shape=x_train.shape[1:]))
    for _ in range(hidden_layers - 1):
        model.add(keras.layers.Dense(layer_size,
                                     activation = 'relu'))
    model.add(keras.layers.Dense(1))
    optimizer = keras.optimizers.SGD(learning_rate)
    model.compile(loss = 'mse', optimizer = optimizer)
    return model

sklearn_model = tf.keras.wrappers.scikit_learn.KerasRegressor(
    build_fn = build_model)
callbacks = [keras.callbacks.EarlyStopping(patience=5, min_delta=1e-2)]
history = sklearn_model.fit(x_train_scaled, y_train,
                            epochs = 10,
                            validation_data = (x_valid_scaled, y_valid),
                            callbacks = callbacks)

from scipy.stats import reciprocal
param_distribution = {
    "hidden_layers":[1, 2, 3, 4],
    "layer_size": np.arange(1, 100),
    "learning_rate": reciprocal(1e-4, 1e-2),
}

from sklearn.model_selection import RandomizedSearchCV

random_search_cv = RandomizedSearchCV(sklearn_model,
                                      param_distribution,
                                      n_iter = 10,
                                      cv = 3,
                                      n_jobs = 1)
random_search_cv.fit(x_train_scaled, y_train, epochs = 100,
                     validation_data = (x_valid_scaled, y_valid),
                     callbacks = callbacks)


但是,最终会出现以下错误:

Cannot clone object , as the constructor either does not set or modifies parameter layer_size

在我看来,我已经包含了参数layer_size

我该怎么解决这个问题?此外,当我更改“n_作业”时>;1、它不能工作


Tags: buildaddlayersizemodelratelayerstrain
2条回答

这是Kera的scikit学习包装中的一个问题,可以通过以下方式解决:

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

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

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

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

它基本上是从深度复制切换到shalow复制

资料来源here

这不是一个完整的答案,但由于Keras的scikit learn包装器返回参数的方式(请参见^{}),克隆过程中似乎有一个bug

An issue在Keras的GitHub上公开了它

平面参数范围的一种解决方法是使用numpy的^{}方法将它们转换为Python列表

相关问题 更多 >