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.
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
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
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é