2 pièce(s) jointe(s)
AttributeError: 'History' object has no attribute 'keys'
Bonjour,
Je débute en Python et pour pratiquer du deep learning je me sert de Python et de PyCharm comme IDE.
Je souhaite tracer les courbes de Loss Vs Epochs et Accuracy Vs Epochs avec le code suivant, j'ai récupéré le modèle entraîné et fine-tuné d'une fonction avec un return, le modèle est bien passé car un "model.summary()" me le détaille bien.
Cependant, j'obtiens l'erreur suivante :
Citation:
"AttributeError: 'History' object has no attribute 'keys'"
voici pourtant les bibliothèques importées (le code couleur de PyCharm grisé pour certaines librairies veut dire je crois "unused statement", ce qui veut dire que je n'y ai pas fait appel malgré l'import, donc je ne comprends pas si c'est lié ou non à mon problème).
Pièce jointe 526386
Pièce jointe 526387
Voici l'extrait du code problématique :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| if __name__ == "__main__":
history = History()
historique = History()
hist = training("/Data/exp42cpi_a/training")
historique = hist
print("Le Summary de historique : ")
historique.summary()
print(historique.history.keys())
# summarize history for accuracy
plt.plot(historique.history['acc'])
plt.plot(historique.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'valid'], loc='upper left')
print("summarize history for accuracy")
plt.show()
plt.savefig('accuracyVsEpochs.png',facecolor='w', edgecolor='b',orientation='portrait', papertype=None, format=None,
transparent=False, bbox_inches=None, pad_inches=0.1, frameon=None, metadata=None) # function savefig allows to save the graph in a file
# summarize history for loss
plt.plot(historique.history['loss'])
plt.plot(historique.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'valid'], loc='upper left')
print("summarize history for loss")
plt.show()
plt.savefig('lossVsEpochs.png',facecolor='w', edgecolor='b',orientation='portrait', papertype=None, format=None,
transparent=False, bbox_inches=None, pad_inches=0.1, frameon=None, metadata=None)""" |
Est-ce que quelqu'un pourrait m'aider ?
Correctif suite à l'erreur trouvée
Citation:
Envoyé par
VinsS
Salut,
Tu réutilises le nom
historique pour autre chose:
Code:
1 2 3 4
|
historique = History()
hist = training("/Data/exp42cpi_a/training")
historique = hist |
On ne sait d'où sort ce
training mais manifestement ça ne retourne pas un dictionnaire.
Bonjour,
merci pour la réponse.
Voici un résumé des éléments que je crois impliqués dans mon problème :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
#train prépare les données, fait de l'augmentation des données avec des flips à l'aide des méthodes ImageDataGenerator, réalise du transfert learning, entraîne le CNN, réalise du fine tuning, sauve le modèle au format.h5 ...
def train(train_dir, val_dir, output_model_file, nb_epoch, batch_size, verbose=True):
...
base_model = VGG16(include_top=False, weights='imagenet')
model = add_new_last_layer(base_model, nb_classes)
...
model.fit_generator( ... paramètres propres à fit generator ...)
...
model.fit_generator(
train_generator,
steps_per_epoch=nb_train_samples / batch_size,
epochs=nb_epoch,
callbacks=[checkpointer],
validation_data=validation_generator,
validation_steps=nb_val_samples / batch_size,
class_weight='auto'
)
# ... et retourne le modèle sous la variable : "trained_model0"
if verbose: print("Saving model...")
model.save(output_model_file)
trained_model0 = model
return trained_model0
#ensuite train est elle même appelée par training
def training(path_to_dataset, output_model_file="weights/weights.h5", nb_epoch=NB_EPOCHS, batch_size=BAT_SIZE):
....
# traitement des répertoires train et valid
...
trained_model1 = train(train_dir, val_dir, output_model_file, nb_epoch, batch_size)
print("Le Summary de trained_model1 : ")
trained_model1.summary()
return trained_model1
#Ensuite c'est le code que j'ai renseigné dans la description de mon problème. |
Je crois avoir trouvé mon erreur car au lieu d'écrire :
Code:
1 2 3 4 5
|
model.fit_generator(
...
)
trained_model0 = model |
J'aurais du écrire :
Code:
1 2 3 4
|
trained_model0 = model.fit_generator(
...
) |
Car je pense que j'ai mis dans la variable retournée le modèle d'architecture du CNN et non le modèle entraîné et fine-tuné.
J'ai donc corrigé en conséquence et finalisé le code du main comme celà:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| if __name__ == "__main__":
historique = training("/Data/exp42cpi_a/training")
print(historique.history.keys())
# summarize history for accuracy
plt.plot(historique.history['acc'])
plt.plot(historique.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'valid'], loc='upper left')
print("summarize history for accuracy")
plt.show()
plt.savefig('accuracyVsEpochs.png', dpi=300, bbox_inches='tight')
plt.close()
# summarize history for loss
plt.plot(historique.history['loss'])
plt.plot(historique.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'valid'], loc='upper left')
print("summarize history for loss")
plt.show()
plt.savefig('lossVsEpochs.png', dpi=300, bbox_inches='tight')
plt.close() |
et le code me retourne bien les graphes de l'accuracy et de la loss Vs Epochs
Je suppose qu'ainsi la variable retournée par chaque fonction dans laquelle je place systématiquement le résultat du modèle entraîné soit un dictionnaire ?
Pyhton reconnaît donc le type dans les déclarations / affectations successives suivantes comme le type dictionnaire :
Code:
1 2 3 4 5 6 7
|
trained_model0 = model.fit_generator(
)
...
trained_model1 = train(train_dir, val_dir, output_model_file, nb_epoch, batch_size)
...
historique = training("/Data/exp42cpi_a/training") |
Merci.