【问题标题】:KeyError: 'Failed to format this callback filepath: Reason: \'lr\''KeyError:'未能格式化此回调文件路径:原因:\'lr\''
【发布时间】:2021-10-09 20:11:54
【问题描述】:

我最近从 Tensorflow 2.2.0 切换到 2.4.1,现在我遇到了 ModelCheckpoint 回调路径的问题。如果我使用 tf 2.2 的环境,此代码可以正常工作,但在使用 tf 2.4.1 时会出错。

checkpoint_filepath = 'path_to/temp_checkpoints/model/epoch-{epoch}_loss-{lr:.2e}_loss-{val_loss:.3e}'
checkpoint = ModelCheckpoint(checkpoint_filepath, monitor='val_loss')

history = model.fit(training_data, training_data,
                    epochs=10,
                    batch_size=32,
                    shuffle=True,
                    validation_data=(validation_data, validation_data),
                    verbose=verbose, callbacks=[checkpoint])

错误:

KeyError: '未能格式化此回调文件路径:“path_to/temp_checkpoints/model/epoch-{epoch}_loss-{lr:.2e}_loss-{val_loss:.3e}”。原因:'lr''

【问题讨论】:

    标签: tensorflow keras callback


    【解决方案1】:

    ModelCheckpoint中,filepath参数的格式化名称,只能包含:epoch + 纪元结束后logs中的键

    您可以像这样在日志中看到可用的密钥:

    class CustomCallback(tf.keras.callbacks.Callback):
        def on_epoch_end(self, epoch, logs=None):
            keys = list(logs.keys())
            print("Log keys: {}".format(keys))
    
    model.fit(..., callbacks=[CustomCallback()])
    

    如果你运行上面的代码,你会看到这样的:

    Log keys: ['loss', 'mean_absolute_error', 'val_loss', 'val_mean_absolute_error']
    

    其中显示了您可以使用的可用密钥(加上epoch)和lr 对您不可用(您使用了 3 个密钥:epochlr 和 @987654332 @ in filepath 名称)。


    解决方案:

    您可以自己将学习率添加到日志中:

    import tensorflow.keras.backend as K
    class CustomCallback(tf.keras.callbacks.Callback):
        def on_epoch_end(self, epoch, logs=None):
            logs.update({'lr': K.eval(self.model.optimizer.lr)})
            keys = list(logs.keys())
            print("Log keys: {}".format(keys)) #you will see now `lr` available
    
    checkpoint_filepath = 'path_to/temp_checkpoints/model/epoch-{epoch}_loss-{lr:.2e}_loss-{val_loss:.3e}'
    checkpoint = ModelCheckpoint(checkpoint_filepath, monitor='val_loss')
    
    history = model.fit(training_data, training_data,
                        epochs=10,
                        batch_size=32,
                        shuffle=True,
                        validation_data=(validation_data, validation_data),
                        verbose=verbose, callbacks=[checkpoint, CustomCallback()])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      相关资源
      最近更新 更多