Я создаю базовую модель c Keras с оболочкой scikit learn, чтобы я мог выполнять случайный поиск перекрестных значений для оптимизации параметров. Код следующий:
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)])
Я получаю сообщение об ошибке в последней строке:
Traceback (последний вызов последним): файл «ml_hyperparams.py», строка 49, в rnd_search_cv.fit (X_train, y_train, epochs = 100, validation_data = (X_valid, y_valid), callbacks = [callbacks.EarlyStopping (терпение = 10)])
Файл "C: \ Users \ Jesus \ AppData \ Roaming \ Python \ Python37 \ site-packages \ sklearn \ model_selection_search.py ", строка 736, соответствует ** self.best_params_)) File" C: \ Users \ AppData \ Roaming \ Python \ Python37 \ site- packages \ sklearn \ base.py ", строка 82, в клоне (оценка, имя))
RuntimeError: невозможно клонировать объект , поскольку конструктор либо не устанавливает, либо изменяет параметр learning_rate
Я где-то читал, что это обычно происходит, когда params dict имеет вложенный список и что его можно исправить с помощью кортежей, следовательно, круглых скобок, но, очевидно, это не работай. Что наиболее необычно в этом, так это то, что я дословно копирую этот код из учебника Орелиена Жерона «Практическое машинное обучение», поэтому я не понимаю, почему возникает эта ошибка. Любая помощь приветствуется, спасибо!