web-dev-qa-db-fra.com

KeyError: '' val_loss "lors de la formation du modèle

J'entraîne un modèle avec des kéros et j'obtiens une erreur de rappel dans la fonction fit_generator. Je cours toujours vers Epoch 3rd et j'obtiens cette erreur

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'

quelqu'un peut-il trouver un problème pour m'aider?

Merci d'avance pour votre aide.

4
Phuc Nguyen

Pour moi, le problème était que j'essayais de définir le initial_Epoch (dans model.fit) à une valeur autre que le 0 standard. Je le faisais parce que j'exécute model.fit dans une boucle qui exécute 10 époques à chaque cycle, puis récupère les données d'historique, vérifie si la perte a diminué et s'exécute model.fit jusqu'à ce qu'il soit satisfait.
J'ai pensé que je devais mettre à jour la valeur car je redémarrais le modèle précédent mais apparemment non ...

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
0

Cette réponse ne s'applique pas à la question, mais elle figurait en haut des résultats Google pour keras "KeyError: 'val_loss'" donc je vais partager la solution de mon problème.

L'erreur était la même pour moi: lors de l'utilisation de val_loss dans le nom du fichier de point de contrôle, j'obtiendrais l'erreur suivante: KeyError: 'val_loss'. Mon checkpointer surveillait également ce champ, donc même si je retirais le champ du nom de fichier, j'obtiendrais toujours cet avertissement du checkpointer: WARNING:tensorflow:Can save best model only with val_loss available, skipping.

Dans mon cas, le problème était que j'étais en train de passer de Keras et Tensorflow 1 séparément à l'utilisation de Keras fourni avec Tensorflow 2. Le paramètre period pour ModelCheckpoint avait été remplacé par save_freq. J'ai supposé à tort que save_freq s'est comporté de la même manière, je l'ai donc réglé sur save_freq=1 pensant que cela sauverait chaque épopée. Cependant, l'état docs :

save_freq: 'Epoch' ou entier. Lorsque vous utilisez 'Epoch', le rappel enregistre le modèle après chaque Epoch. Lorsque vous utilisez un entier, le rappel enregistre le modèle à la fin d'un lot dans lequel autant d'échantillons ont été vus depuis la dernière sauvegarde. Notez que si la sauvegarde n'est pas alignée sur les époques, la métrique surveillée peut potentiellement être moins fiable (elle peut refléter aussi peu qu'un lot, car les métriques sont réinitialisées à chaque époque). Par défaut, "Epoch"

Réglage save_freq='Epoch' a résolu le problème pour moi. Remarque: l'OP utilisait toujours period=1 donc ce n'est certainement pas la cause de leur problème

0
JoshuaCWebDeveloper

Dans mon cas, le val_generator a été cassé lorsque le carnet de notes colab essaie de lire les images de Google Drive. Donc, je lance à nouveau la cellule créer val_generator et cela a fonctionné

0
Vo Trung