keras 训练模型时发生KeyError:“val_loss”

baubqpgj  于 2022-12-23  发布在  其他
关注(0)|答案(9)|浏览(635)

我正在用keras训练一个模型,并且在fit_generator函数的回调中得到一个错误。我总是运行到epoch 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'

有谁能找出问题来帮我吗?
先谢谢你的帮助。

3npbholx

3npbholx1#

这个回调在迭代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变量中没有瓦尔_loss:

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

如果在没有validation_data的情况下调用fit,则会发生这种情况。
我将从简化模型检查点的路径名开始,在名称中包含epoch可能就足够了。

mcdcgff0

mcdcgff02#

这个答案不适用于这个问题,但它在谷歌搜索结果的顶部,所以我将分享我的问题的解决方案。
我也犯了同样的错误:在检查点文件名中使用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状态:
保存频率:“epoch”或整数。使用“epoch”时,回调在每个epoch后保存模型。使用整数时,回调在批处理结束时保存模型,在该批处理结束时,自上次保存以来已看到这么多样本。请注意,如果保存未与epoch对齐,则监视的度量可能不太可靠(它可能只反映1个批次,因为指标会在每个时期重置)。默认为'epoch'
设置save_freq='epoch'为我解决了这个问题。注意:操作员仍在使用period=1,因此这绝对不是导致问题的原因

jfgube3f

jfgube3f3#

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

ki1q1bka

ki1q1bka4#

当我们未向模型提供确认数据并检查model.fit_generator(或model.fit)的参数(train_data、steps_per_epoch、validation_data、validation_steps、epoch、initial_epoch、回调)时,会发生此错误

gz5pxeao

gz5pxeao5#

对我来说,问题是我试图将initial_epochmodel.fit中)设置为标准0以外的值。我这样做是因为我在循环中运行model.fit,每个循环运行10个历元,然后检索历史数据,检查损耗是否减少,并再次运行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
w6mmgewl

w6mmgewl6#

在我的情况下,瓦尔_generator被打破时,colab笔记本试图从谷歌驱动器读取图像。所以我运行细胞创建val_generator再次和它的工作

i34xakig

i34xakig7#

我有这个错误,并没有设法找到错误的原因在任何地方在线.
在我的例子中,我要求的训练样本比实际拥有的要多,TF没有给予我一个明确的错误,它甚至为我提供了一个保存的损失值,我只收到了深奥的KeyError:“瓦尔_loss”时尝试保存。
希望这有助于有人嗅出他们愚蠢的错误,如果这是发生在他们身上。

wxclj1h5

wxclj1h58#

应添加此参数validation_data=(x_test,y_test)以拟合模型

tzdcorbm

tzdcorbm9#

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

相关问题