web-dev-qa-db-fra.com

AttributeError: l'objet 'séquentiel' n'a pas d'attribut 'noms_sortie'

J'ai un problème avec le code ci-dessous De la ligne suivante new_model = load_model ('124446.model', custom_objects = None, compile = True) Voici le code:

import tensorflow as tf
from tensorflow.keras.models import load_model

mnist = tf.keras.datasets.mnist

(x_train,y_train), (x_test,y_test) = mnist.load_data()

x_train = tf.keras.utils.normalize(x_train,axis=1)
x_test = tf.keras.utils.normalize(x_test,axis=1)

model = tf.keras.models.Sequential()

model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128,activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(128,activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(10,activation=tf.nn.softmax))

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(x_train,y_train,epochs=3)


tf.keras.models.save_model(model,'124446.model')


val_loss, val_acc = model.evaluate(x_test,y_test)
print(val_loss, val_acc)


new_model = load_model('124446.model', custom_objects=None, compile=True)


prediction = new_model.predict([x_test])
print(prediction)

Les erreurs sont:

Traceback (appel le plus récent en dernier): Fichier "C: /Users/TanveerIslam/PycharmProjects/DeepLearningPractice/1.py", , Ligne 32, dans New_model = load_model (' 124446.model ', custom_objects = None, compile = True) Fichier "C:\Utilisateurs\TanveerIslam\PycharmProjects\DeepLearningPractice\venv\lib\site-packages\tensorflow\python\keras\engine\saving \py ", ligne 262, dans load_model sample_weight_mode = sample_weight_mode) Fichier" C:\Utilisateurs\TanveerIslam\PycharmProjects\DeepLearningPractice\venv\lib\sites-packages\tensorflow\python\training\checkpointable\base.py ", ligne 426, dans la méthode _method_wrapper (self, * args, ** kwargs) Fichier" C:\Users\TanveerIslam\PycharmProjects\DeepLearningPractice\venv\lib\site\packages\tensorflow\python\keras\engine\training.py ", ligne 525, dans des métriques de compilation , self.output_names)

AttributeError: l'objet 'séquentiel' n'a pas d'attribut 'noms_sortie'

Ainsi, quelqu'un peut-il me donner une solution de fourmi.

Note: J'utilise pycharm comme IDE.

2
Tanveer Islam

J'ai pu charger le modèle en définissant compile = False in load_model ()

1
Shinva

Si cela est exécuté sous Windows, le problème est qu’à l’heure actuelle, la toco n’est pas prise en charge sous Windows - https://github.com/tensorflow/tensorflow/issues/20975

0
surya

Comme @Shinva a dit de définir l'attribut "compile" de la fonction load_model sur "False". Ensuite, après le chargement du modèle, compilez-le séparément.

from tensorflow.keras.models import save_model, load_model
save_model(model,'124446.model')

Ensuite, pour charger à nouveau le modèle, procédez comme suit:

saved_model = load_model('124446.model', compile=False)
saved_model.compile(optimizer='adam',
          loss='sparse_categorical_crossentropy',
          metrics=['accuracy'])
saved_model.predict([x_test])

Update : Pour des raisons inconnues, j'ai commencé à avoir les mêmes erreurs que la question. Après avoir essayé de trouver différentes solutions, il semble que l’utilisation de la bibliothèque "keras" directement au lieu de "tensorflow.keras" fonctionne correctement. 

Ma configuration est sur "Windows 10" avec python: '3.6.7', tensorflow: '1.11.0' et keras: '2.2.4'

Selon mes connaissances, il existe trois manières différentes de sauvegarder et de restaurer votre modèle. à condition que vous ayez utilisé keras directement pour fabriquer votre modèle.

Option1:

import json
from keras.models import model_from_json, load_model

# Save Weights + Architecture
model.save_weights('model_weights.h5')
with open('model_architecture.json', 'w') as f:
    f.write(model.to_json())

# Load Weights + Architecture
with open('model_architecture.json', 'r') as f:
    new_model = model_from_json(f.read())
new_model.load_weights('model_weights.h5')

Option2:

from keras.models import save_model, load_model

# Creates a HDF5 file 'my_model.h5' 
save_model(model, 'my_model.h5') # model, [path + "/"] name of model

# Deletes the existing model
del model  

# Returns a compiled model identical to the previous one
new_model = load_model('my_model.h5')

Option 3

# using model's methods
model.save("my_model.h5")

# deletes the existing model
del model

# load the saved model back
new_model = load_model('my_model.h5')

L'option 1 requiert que le nouveau_modèle soit compilé avant de l'utiliser. 

Les options 2 et 3 sont presque identiques en syntaxe. 

Codes utilisés à partir de:
1. Sauvegarde et chargement des modèles Keras
2. https://keras.io/getting-started/faq/#how-can-i-save-a-keras-model

0
Vaibhav Singh