运行交叉验证时Keras回调

运行交叉验证时Keras回调,keras,Keras,我已经读到,当您还想使用模型回调时,您不能使用Keras进行交叉验证,但后来证明这毕竟是可能的。然而,我很难把它融入到我的环境中 为了更详细地探讨这一点,我将遵循,并使用 这是一个三类分类问题,我正试图使用多层感知器(目前只有一层用于测试)。我现在的目标是在模型回调中工作,这样我就可以保存最佳模型的权重。下面,我在我的network\u mlp一节中尝试这样做。为了说明模型在没有回调的情况下工作,我还包括network\u mlp\u no\u回调 您应该能够将其复制/粘贴到python会话中并

我已经读到,当您还想使用模型回调时,您不能使用Keras进行交叉验证,但后来证明这毕竟是可能的。然而,我很难把它融入到我的环境中

为了更详细地探讨这一点,我将遵循,并使用

这是一个三类分类问题,我正试图使用多层感知器(目前只有一层用于测试)。我现在的目标是在模型回调中工作,这样我就可以保存最佳模型的权重。下面,我在我的
network\u mlp
一节中尝试这样做。为了说明模型在没有回调的情况下工作,我还包括
network\u mlp\u no\u回调

您应该能够将其复制/粘贴到python会话中并运行它,没有问题。要复制我看到的错误,请取消注释最后一行

错误:
RuntimeError:无法克隆对象,因为构造函数似乎没有设置参数回调

代码:第一节读取数据;第二个是带有回调的模型,它不起作用;第三个是没有回调的模型,它可以工作(提供上下文)


问题:如何将模型回调合并到KerasClassifier中?

该解决方案与您引用的另一个答案非常接近,但略有不同,因为它们使用多个估计值,而您只有一个。通过将
fit_params={'callbacks':callbacks_list}
添加到
cross_val_score
调用中,从
estimator
初始化中删除回调列表,并将
save_best_only
更改为
False
,我可以使检查点工作

所以现在
network\u mlp
中的代码小节如下所示:

checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=False, mode='max')
callbacks_list = [checkpoint]
estimator = KerasClassifier(build_fn=mlp_model, epochs=epochs, batch_size=b_size, verbose=0)
kfold = KFold(n_splits=10, shuffle=True, random_state=7)
results = cross_val_score(estimator, X, Y, cv=kfold, fit_params={'callbacks': callbacks_list})
save_best_only=False
是必需的,因为您没有为神经网络设置验证拆分,因此
val_acc
不可用。如果要使用验证子拆分,例如,可以将估计器初始化更改为:

estimator = KerasClassifier(build_fn=mlp_model, epochs=epochs, batch_size=b_size, verbose=0, validation_split=.25)
祝你好运

estimator = KerasClassifier(build_fn=mlp_model, epochs=epochs, batch_size=b_size, verbose=0, validation_split=.25)