在sklearn的cross_validate中保存所有Keras包装器估计器的权重

2024-06-01 06:05:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图为KerasClassifier包装的Keras模型保留某些历元频率的权重,这将进入sklearn的cross_验证。更具体地说,我想使用模型检查点回调保存所有克隆估计器的权重,这些估计器针对每个CV分割进行训练

我想用它来监控特定时期的混淆矩阵,用于所有分割训练

我尝试了以下代码:

import matplotlib.pyplot as plt

    
from sklearn.datasets import make_blobs

n_features = 5

centers = 2
n_samples = 1000
X, y = make_blobs(n_samples=n_samples, centers=centers, n_features=n_features, random_state=3)



def wrap_binary_kerasNN(nodes=16, input_dim=3):

    def create_model():
        # create model

        from keras import models
        from keras import layers
        model = models.Sequential()
        model.add(layers.Dense(nodes,input_dim=input_dim,activation='relu'))
        model.add(layers.Dense(nodes, activation='relu'))
        model.add(layers.Dense(1, activation='sigmoid'))
        # Compile model
        model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
        print("create_model: building a simple NN")
        return model
    model = KerasClassifier(build_fn=create_model, verbose=0, ) 
    return model

# Create the model
model = wrap_binary_kerasNN()

# set-up Model Checkpoint callback
from datetime import datetime
weights_dir = os.getcwd()+"/weights"
from keras.callbacks import ModelCheckpoint
model_checkpoint = ModelCheckpoint(weights_dir + "/"+str(datetime.now().timestamp())+"_weights.{epoch:02d}.hdf5",
                                   monitor='acc', verbose=0,
                                   save_best_only=False, save_weights_only=False, period=1,
                                   mode='auto')

# Create Train-Test samples with Stratified K-Fold
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=5,shuffle=True)
skf.get_n_splits(X,y)
print(skf)

from sklearn.model_selection import cross_validate
cv_results = cross_validate(model, X, y, cv=skf, return_estimator=True, scoring=None, 
    fit_params={'callbacks':[model_checkpoint]})

但这只为似乎只有一个模型节省了权重。 有什么解决办法吗?实际上,这可能只是因为保存了权重文件名,但我似乎无法找到任何解决方法

谢谢


Tags: from模型importmodellayerscreatesklearn权重