KeyError: ''val_loss' 训练模型时

Phu*_*yen 9 python keras yolo

我正在用 keras 训练模型,并且在 fit_generator 函数的回调中出现错误。我总是跑到第三纪元并得到这个错误

annotation_path = 'train2.txt'
    log_dir = 'logs/000/'
    classes_path = 'model_data/deplao_classes.txt'
    anchors_path = 'model_data/yolo_anchors.txt'
    class_names = get_classes(classes_path)
    num_classes = len(class_names)
    anchors = get_anchors(anchors_path)

    input_shape = (416,416) # multiple of 32, hw

    is_tiny_version = len(anchors)==6 # default setting
    if is_tiny_version:
        model = create_tiny_model(input_shape, anchors, num_classes,
            freeze_body=2, weights_path='model_data/tiny_yolo_weights.h5')
    else:
        model = create_model(input_shape, anchors, num_classes,
            freeze_body=2, weights_path='model_data/yolo_weights.h5') # make sure you know what you freeze

    logging = TensorBoard(log_dir=log_dir)
    checkpoint = ModelCheckpoint(log_dir + 'ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5',
        monitor='val_loss', save_weights_only=True, save_best_only=True, period=3)

    reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3, verbose=1)
    early_stopping = EarlyStopping(monitor='val_loss', min_delta=0, patience=10, verbose=1)


[error]
Traceback (most recent call last):
  File "train.py", line 194, in <module>
    _main()
  File "train.py", line 69, in _main
    callbacks=[logging, checkpoint])
  File "C:\Users\ilove\AppData\Roaming\Python\Python37\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)
  File "C:\Users\ilove\AppData\Roaming\Python\Python37\lib\site-packages\keras\engine\training.py", line 1418, in fit_generator
    initial_epoch=initial_epoch)
  File "C:\Users\ilove\AppData\Roaming\Python\Python37\lib\site-packages\keras\engine\training_generator.py", line 251, in fit_generator
    callbacks.on_epoch_end(epoch, epoch_logs)
  File "C:\Users\ilove\AppData\Roaming\Python\Python37\lib\site-packages\keras\callbacks.py", line 79, in on_epoch_end
    callback.on_epoch_end(epoch, logs)
  File "C:\Users\ilove\AppData\Roaming\Python\Python37\lib\site-packages\keras\callbacks.py", line 429, in on_epoch_end
    filepath = self.filepath.format(epoch=epoch + 1, **logs)
KeyError: 'val_loss'

Run Code Online (Sandbox Code Playgroud)

任何人都可以找出问题来帮助我吗?

在此先感谢您的帮助。

小智 9

此回调在迭代 3 结束时运行。

    checkpoint = ModelCheckpoint(log_dir + 'ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5',
        monitor='val_loss', save_weights_only=True, save_best_only=True, period=3)

Run Code Online (Sandbox Code Playgroud)

报错信息是说logs执行时变量中没有val_loss :

filepath = self.filepath.format(epoch=epoch + 1, **logs)
Run Code Online (Sandbox Code Playgroud)

如果在没有validation_data 的情况下调用fit,就会发生这种情况。

我将从简化模型检查点的路径名开始。在名称中包含时代可能就足够了。


Jos*_*per 6

此答案不适用于该问题,但这是 Google 结果的顶部,keras "KeyError: 'val_loss'"因此我将分享我的问题的解决方案。

错误对我来说是一样的:val_loss在检查点文件名中使用时,我会收到以下错误:KeyError: 'val_loss'. 我的检查点也在监视这个字段,所以即使我从文件名中删除了这个字段,我仍然会从检查点收到这个警告:WARNING:tensorflow:Can save best model only with val_loss available, skipping.

就我而言,问题是我从分别使用 Keras 和 Tensorflow 1 升级到使用 Tensorflow 2 附带的 Keras。period参数 forModelCheckpoint已替换为save_freq. 我错误地认为它的save_freq行为方式相同,因此我将其设置为save_freq=1认为这可以保存每部史诗。但是,文档指出:

save_freq: 'epoch' 或整数。使用 'epoch' 时,回调会在每个 epoch 之后保存模型。使用整数时,回调在批次结束时保存模型,自上次保存以来已经看到了这么多样本。请注意,如果保存未与时期对齐,则受监控的指标可能不太可靠(它可能反映少至 1 个批次,因为指标在每个时期都会重置)。默认为“纪元”

设置save_freq='epoch'为我解决了这个问题。注意:OP 仍在使用,period=1所以这绝对不是导致他们问题的原因