如何使Scikit-Learn GridSearchCV知道自定义的Keras损失函数?

时间:2019-02-15 22:25:18

标签: python tensorflow keras scikit-learn jupyter-notebook

我正在尝试为我的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)

有效。我相信我必须以某种方式传播自己的功能。我该怎么办?

0 个答案:

没有答案