繁体   English   中英

Keras ModelCheckpoint 未保存但 EarlyStopping 使用相同的监视器参数工作正常

Keras ModelCheckpoint not saving but EarlyStopping is working fine with the same monitor argument

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我已经构建了一个模型,并且正在使用自定义函数进行验证。 问题是:我的自定义验证函数将验证准确性保存在日志字典中,但 Keras ModelCheckpoint 不知何故看不到它。 EarlyStopping 工作正常。

这是验证类的代码:

class ValidateModel(keras.callbacks.Callback):
    
    def __init__(self, validation_data, loss_fnc):
        super().__init__()
        self.validation_data = validation_data
        self.loss_fnc = loss_fnc
    
    def on_epoch_end(self, epoch, logs={}):
        
        th = 0.5
        
        features = self.validation_data[0]
        y_true = self.validation_data[1].reshape((-1,1))     
        
        y_pred = np.asarray(self.model.predict(features)).reshape((-1,1))
        
        #Computing the validation loss.
        y_true_tensor = K.constant(y_true)
        y_pred_tensor = K.constant(y_pred)
        
        val_loss = K.eval(self.loss_fnc(y_true_tensor, y_pred_tensor))
        
        #Rounding the predicted values based on the threshold value.
        #Values lesser than th are rounded to 0, while values greater than th are rounded to 1.
        y_pred_rounded = y_pred / th
        y_pred_rounded = np.clip(np.floor(y_pred_rounded).astype(int),0,1)
        y_pred_rounded_tensor = K.constant(y_pred_rounded)
        
        val_acc = accuracy_score(y_true, y_pred_rounded)
        
        logs['val_loss'] = val_loss
        logs['val_acc'] = val_acc
        
        print(f'\nval_loss: {val_loss} - val_acc: {val_acc}')

这是我用来训练模型的函数:

def train_generator_model(model):
    steps = int(train_df.shape[0] / TRAIN_BATCH_SIZE)

    cb_validation = ValidateModel([validation_X, validation_y], iou)
    cb_early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_acc', 
                                                     patience=3, 
                                                     mode='max', 
                                                     verbose = 1)
    cb_model_checkpoint = tf.keras.callbacks.ModelCheckpoint('/kaggle/working/best_generator_model.hdf5',
                                                             monitor='val_acc',
                                                             save_best_only=True,
                                                             mode='max',
                                                             verbose=1)

    history = model.fit(
        x = train_datagen, 
        epochs = 2, ##Setting to 2 to test.
        callbacks = [cb_validation, cb_model_checkpoint, cb_early_stop], 
        verbose = 1,
        steps_per_epoch = steps)
    
    #model = tf.keras.models.load_model('/kaggle/working/best_generator_model.hdf5', custom_objects = {'iou':iou})
    #model.load_weights('/kaggle/working/best_generator_model.hdf5')
    
    return history

如果我将 ModelCheckpoint 参数 "save_best_model" 设置为False ,模型将被完美保存。 当训练结束并运行history.history 时,我可以看到正在记录 val_loss,如下所示:

{ '损失':[0.13096405565738678,0.11926634609699249], 'binary_accuracy':[0.9692355990409851,0.9716895818710327], 'val_loss':[0.23041087,0.18325138], 'val_acc':[0.9453247578938803,0.956172612508138]}

我正在使用Tensorflow 2.3.1并从tensorflow导入keras

任何帮助表示赞赏。 谢谢!

1 个回复

我检查了 Tensorflow 代码,发现 Tensorflow 和 Keras 之间不兼容。 tensorflow.keras.callbacks文件中,有以下代码:

from keras.utils import tf_utils

问题是 keras.utils 中没有 tf_utils (至少我使用的 Keras 2.4.3 中没有)。 奇怪的是,没有抛出异常。

修复 #1:将以下代码添加到您的程序中:

class ModelCheckpoint_tweaked(tf.keras.callbacks.ModelCheckpoint):
    def __init__(self,
                   filepath,
                   monitor='val_loss',
                   verbose=0,
                   save_best_only=False,
                   save_weights_only=False,
                   mode='auto',
                   save_freq='epoch',
                   options=None,
                   **kwargs):
        
        #Change tf_utils source package.
        from tensorflow.python.keras.utils import tf_utils
        
        super(ModelCheckpoint_tweaked, self).__init__(filepath,
                   monitor,
                   verbose,
                   save_best_only,
                   save_weights_only,
                   mode,
                   save_freq,
                   options,
                   **kwargs)

然后使用这个新类作为 ModelCheckpoint 回调:

cb_model_checkpoint = ModelCheckpoint_tweaked(file_name,
                                              monitor='val_acc',
                                              save_best_only=True,
                                              mode='max',
                                              verbose=1)

修复 #2:

Tensorflow更新到2.4.0版。 如果您使用自定义回调来计算受监控参数,请将以下行添加到自定义回调__init__()函数:

self._supports_tf_logs = True

如果您不添加此行,则不会在回调之间保留日志。

2 使用监视器的作家/读者无法正常工作

我正在做一个作业,正在实现使用监视器进行同步的Writer / Reader问题。 方案:编写者应一次将列表中的一个字符串写入一个缓冲区(该缓冲区一次只能容纳一个字符串)。 然后,读取器应从缓冲区中读取字符串,并在gui中打印字符串,两次打印之间要暂停0.5秒。 该程序使用一个单一的编 ...

3 摆动监视器未保存的更改

我开发了一个由12个JPanel组成的图形界面,每个JPanel包含4到10个JTextField。 我希望实现一个未保存的更改警告 ,以防用户更改了某些JTextField的内容,但没有将更改提交到数据库。 如何实现呢? 我的第一个想法是使用ItemListener并注册所有JTex ...

5 用Java中的JNA关闭监视器无法正常工作

使用通过JNA关闭监视器的示例 ,我遇到了以下问题:监视器按预期方式关闭,但立即在一秒钟内打开。 即使我将睡眠和打开显示器的部分注释掉了。 全部都一样。 我以为当控制权返回主线程时,监视器会打开。 但这不是那样。 在新线程中运行此代码段将得到相同的结果。 我也尝试过Power ...

6 电子电源监视器关闭事件无法正常工作

嗨,大家好 。 在Mac上的电子上。 当电子应用程序运行时,不允许用户关闭或重新启动设备,他强行退出了该应用程序。 所以我使用了powerMonitor关闭事件https://electronjs.org/docs/api/power-monitor,但即使我们退出应用程序也不会触发关闭事 ...

7 SQL Developer 4监视器会话无法正常工作

我有SQL Developer版本4.0.0.13,我连接到Oracle9i企业版版本9.2.0.8.0。 我尝试使用工具菜单中的监视器会话/运行数据库管理 - >会话下的会话报告,我总是得到以下错误。 我将Sessions报告复制到UserDefinedReports并进行 ...

9 如何使用 tf.keras.callbacks.ModelCheckpoint 通过训练步骤保存模型

我的训练数据非常大,这意味着每个 epoch 都有很多训练步骤。 我想使用tf.keras.callbacks.ModelCheckpoint每100,000步保存一个模型,并将所有这些模型保存在磁盘中,而不是在保存新模型时重写模型文件。 但是在阅读文档后,我不知道该怎么做。 似乎此回调旨在按纪元保 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM