web-dev-qa-db-ja.com

KeyError:モデルのトレーニング時の「val_loss」

ケラスでモデルをトレーニングしていて、fit_generator関数のコールバックでエラーが発生します。私はいつもエポック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'

誰かが私を助けるために問題を見つけることができますか?

よろしくお願いします。

4
Phuc Nguyen

私にとっての問題は、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

この回答は質問には適用されませんが、これは_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を使用するようにアップグレードしていたことでした。periodModelCheckpoint paramは_save_freq_。 _save_freq_が同じように動作すると誤って想定したので、これを_save_freq=1_に設定します。ただし、 docs 状態:

save_freq: 'Epoch'または整数。 「エポック」を使用する場合、コールバックは各エポックの後にモデルを保存します。整数を使用する場合、コールバックは、最後の保存以降にこの数のサンプルが確認されたバッチの最後にモデルを保存します。節約がエポックに合わせられていない場合、監視されるメトリックは信頼性が低くなる可能性があることに注意してください(メトリックはエポックごとにリセットされるため、1バッチも反映されない可能性があります)。デフォルトは「エポック」

_save_freq='Epoch'_を設定すると、問題が解決しました。 注:OPはまだ_period=1_を使用していたため、これは間違いなく問題の原因ではありませんでした

0

私の場合、colabノートブックがGoogleドライブから画像を読み取ろうとすると、val_generatorが壊れました。だから私はもう一度セルを作成し、val_generatorを作成し、それはうまくいきました

0
Vo Trung