IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

AttributeError: 'History' object has no attribute 'keys' [Python 3.X]


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Maintenance Prédictive
    Inscrit en
    Mars 2017
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Maintenance Prédictive
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2017
    Messages : 39
    Par défaut 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 :
    "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).

    Nom : thumbnail_image1.png
Affichages : 1812
Taille : 21,4 Ko
    Nom : thumbnail_image2.png
Affichages : 1872
Taille : 17,4 Ko

    Voici l'extrait du code problématique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 306
    Par défaut
    Salut,

    Tu réutilises le nom historique pour autre chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre averti
    Homme Profil pro
    Maintenance Prédictive
    Inscrit en
    Mars 2017
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Maintenance Prédictive
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2017
    Messages : 39
    Par défaut Correctif suite à l'erreur trouvée
    Citation Envoyé par VinsS Voir le message
    Salut,

    Tu réutilises le nom historique pour autre chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    model.fit_generator(
    ...
    )
    trained_model0 = model
    J'aurais du écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. AttributeError "nonetype" object has no attribute
    Par Invité dans le forum Général Python
    Réponses: 2
    Dernier message: 14/12/2010, 20h49
  2. Selenium - AttributeError: 'module' object has no attribute
    Par bender1979 dans le forum Général Python
    Réponses: 4
    Dernier message: 09/11/2010, 22h03
  3. Probleme : AttributeError: 'tuple' object has no attribute
    Par MrGecko dans le forum Général Python
    Réponses: 1
    Dernier message: 27/05/2007, 09h59
  4. Réponses: 2
    Dernier message: 26/05/2006, 14h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo