我正在尝试为我的Keras模型(包含自定义损失函数)和gridsearchcv查找超参数。
当我手动运行此命令(在gridsearch之外)时,它可以工作。但是,如果我在其上运行gridsearchcv并并行执行此操作,则在设置参数n_jobs=-1
时,Koby后端执行的序列化似乎存在一些问题。
这是我设置自定义损失函数的方式:
from keras import backend as K
def my_loss(y_true, y_pred):
# perform some calculations using K
# ...
return 1 - K.mean(score)
这是我的模型函数,它从网格搜索中获取一些参数:
from keras.models import Model
from keras.layers import Dense, Dropout, Input
def create_model(hidden_layers, activation, last_activation, optimizer, drop_rate, initializer, units, input_dim):
# some layer definitions of inputs and outputs
model = Model(inputs, outputs)
model.compile(loss=my_loss, optimizer=optimizer, metrics=['binary_accuracy'])
return model
最后,我如何将其组合在一起:
from sklearn.model_selection import GridSearchCV, StratifiedKFold
from keras.wrappers.scikit_learn import KerasClassifier
skfs = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)
parameters = {'hidden_layers': [...],
'activation':[...],
'last_activation': [...],
'optimizer':[...],
'drop_rate':[...],
'initializer':[...],
'units':[...],
'input_dim': [...]
}
model = KerasClassifier(build_fn=create_model, epochs=100, batch_size=256, verbose=0)
classifier = GridSearchCV(estimator=model, param_grid=parameters, cv=skfs, scoring=score, verbose=1, n_jobs=-1, return_train_score=True)
results = classifier.fit(X, y, callbacks=early_stopping)
执行上述代码时,出现异常,提示my_loss
函数未知。但是,如果我将其更改为(请参阅n_jobs
参数):
classifier = GridSearchCV(estimator=model, param_grid=parameters, cv=skfs, scoring=score, verbose=1, n_jobs=1, return_train_score=True)
有效。我相信我必须以某种方式传播自己的功能。我该怎么办?