【问题标题】:KeyError: ''val_loss" when training modelKeyError: ''val_loss" 训练模型时
【发布时间】:2019-11-12 19:30:45
【问题描述】:

我正在使用 keras 训练模型,但在 fit_generator 函数的回调中出现错误。我总是跑到 epoch 3 并得到这个错误

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'

谁能找出问题来帮助我?

提前感谢您的帮助。

【问题讨论】:

  • 请添加适合您的功能和前 2 个 epochs 打印
  • val_loss 将在通过validation set时可用

标签: python keras yolo


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    此答案不适用于该问题,但这是 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。ModelCheckpointperiod 参数已被 save_freq 替换。我错误地认为save_freq 的行为方式相同,所以我将其设置为save_freq=1,认为这样可以节省每一部史诗。但是,docs 状态:

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

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

    【讨论】:

      【解决方案3】:

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

      switch = True
      epoch = 0
      wait = 0
      previous = 10E+10
      while switch:
          history = model.fit( X, y, batch_size=1, epochs=step, verbose=False )
          epoch += step
          current = history.history["loss"][-1]
          if current >= previous:
              wait += 1
              if wait >= tolerance:
                  switch = False
          else:
              wait = 0
          if epoch >= max_epochs:
              switch = False
          previous = current
      

      【讨论】:

        【解决方案4】:

        在我的情况下,当 colab 笔记本尝试从谷歌驱动器读取图像时,val_generator 损坏了。所以我再次运行 cell create val_generator 并且它工作了

        【讨论】:

          【解决方案5】:

          我不知道这是否适用于所有情况。但是,对我来说,我重新启动了我的电脑,它似乎工作了。

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

                我遇到了这个错误,并没有设法在线找到错误的原因。

                在我的案例中发生的情况是,我要求的训练样本比实际拥有的要多。 TF 没有给我一个明确的错误,它甚至为我提供了一个保存的损失值。我在尝试保存时只收到了深奥的 KeyError: "val_loss"。

                希望这可以帮助某人发现他们的愚蠢错误,如果这就是发生在他们身上的事情。

                【讨论】:

                  猜你喜欢
                  • 2019-10-02
                  • 1970-01-01
                  • 2018-01-10
                  • 2020-04-05
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-06-14
                  • 1970-01-01
                  • 2017-08-19
                  相关资源
                  最近更新 更多