KeyError:训练模型时出现“ val_loss”

时间:2019-07-02 07:39:59

标签: python keras yolo

我正在使用keras训练模型,并且在fit_generator函数的回调中遇到错误。我总是跑到纪元3rd并得到这个错误

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'

有人能找到问题帮助我吗?

预先感谢您的帮助。

7 个答案:

答案 0 :(得分:1)

当我们没有向模型提供验证数据时会发生此错误, 并检查model.fit_generator(train_data,steps_per_epoch,validation_data,validation_steps,epochs,initial_epoch,callbacks)的参数

答案 1 :(得分:0)

此回调在迭代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)

该错误消息声称执行时logs变量中没有val_loss:

filepath = self.filepath.format(epoch=epoch + 1, **logs)

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

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

答案 2 :(得分:0)

此答案不适用于该问题,但这在keras "KeyError: 'val_loss'"的Google搜索结果中排名最高,因此,我将分享我的问题的解决方案。

错误对我来说是相同的:在检查点文件名中使用val_loss时,会出现以下错误:KeyError: 'val_loss'。我的检查指针也正在监视该字段,因此即使我从文件名中删除了该字段,我仍然会从检查指针处收到以下警告:WARNING:tensorflow:Can save best model only with val_loss available, skipping.

就我而言,问题是我正在从分别使用Keras和Tensorflow 1升级到使用Tensorflow 2随附的Keras。period的{​​{1}}参数已替换为{ {1}}。我错误地假设ModelCheckpoint的行为方式相同,因此我将其设置为save_freq,以为这会保存所有史诗。但是,docs状态:

  

save_freq:'epoch'或整数。当使用'epoch'时,回调在每个时期之后保存模型。使用整数时,回调将在最后一次保存后看到这么多样本的批处理结束时保存模型。请注意,如果保存未与时间段保持一致,则受监视的指标可能会不太可靠(它可能只反映1个批次,因为每个时间段都会重置该指标)。默认为“时代”

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

答案 3 :(得分:0)

对我来说,问题是我试图将initial_epoch中的model.fit设置为标准0以外的值。之所以这样做是因为我正在运行{{1} },每个循环运行10个纪元,然后检索历史数据,检查损失是否减少,然后再次运行model.fit直到满意为止。
我以为在重新启动以前的模型时必须更新值,但是显然没有...

model.fit

答案 4 :(得分:0)

就我而言,当colab笔记本尝试从Google驱动器读取图像时,val_generator损坏。所以我再次运行单元格创建val_generator,它起作用了

答案 5 :(得分:0)

在文件路径和检查点中使用 val_accuracy。如果仍然没有改善,只需重新启动电脑或 colab。

答案 6 :(得分:-2)

我不知道这是否适用于所有情况。但是,对我来说,我重新启动了计算机,它似乎可以工作了。