尝试使用随机 CV 参数数组,但收到错误消息:
ValueError: Invalid parameter model_optimizer_learning_rate for estimator KerasClassifier.
This issue can likely be resolved by setting this parameter in the KerasClassifier constructor:
`KerasClassifier(model_optimizer_learning_rate=0.01)`
Check the list of available parameters with `estimator.get_params().keys()`
code:
`
def create_model_v4(lr,batch_size):
np.random.seed(1337)
model = Sequential()
model.add(Dense(256,activation='relu',input_dim = X_train.shape[1]))
............................................................................
model.add(Dense(32,activation='relu'))
model.add(Dense(1, activation='sigmoid'))
#compile model
optimizer = tf.keras.optimizers.Adam(learning_rate=lr)
model.compile(optimizer = optimizer,loss = 'binary_crossentropy', metrics = ['accuracy'])
return model
keras_estimator = KerasClassifier(build_fn=create_model_v4, verbose=1)
# define the grid search parameters
param_random = {
'batch_size':[32, 64, 128],
"lr":[0.01,0.1,0.001],}
kfold_splits = 3
random= RandomizedSearchCV(estimator=keras_estimator,
verbose=1,
cv=kfold_splits,
param_distributions=param_random,n_jobs=-1)
random_result = random.fit(X_train, y_train,validation_split=0.2,verbose=1)
# Summarize results
print("Best: %f using %s" % (random_result.best_score_, random_result.best_params_))
means = random_result.cv_results_['mean_test_score']
stds = random_result.cv_results_['std_test_score']
params = random_result.cv_results_['params']``
我已经尝试过lr作为合适的learning_rate,我已经尝试过optimizer_lr等,但可能我没有实现我正确找到的解决方案。
学习率是优化器的参数,而不是模型的参数。因此,在 SciKeras 包装器中,您需要将参数路由到优化器。您可以使用网格字典中的前缀 optimizationr__ 来完成此操作。
尝试以下词典
param_random = {
'batch_size':[32, 64, 128],
"optimizer__learning_rate":[0.01,0.1,0.001],
#"optimizer__lr":[0.01,0.1,0.001],
}
不确定是否应该像构造函数那样使用 lr 参数,还是 Keras 优化器默认参数 (learning_rate)。尝试两者并选择合适的。
我建议您使用以下资源来使用 SciKeras 包装器微调 Keras 模型。此案例和其他案例已得到解决。
https://machinelearningmastery.com/grid-search-hyperparameters-deep-learning-models-python-keras/