web-dev-qa-db-fra.com

Tensorflow —— keras model.save () déclenche NotImplementedError

import tensorflow as tf 

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)

Quand j'ai essayé de sauvegarder le modèle

model.save('epic_num_reader.model')

Je reçois une erreur NotImplementedError: 

NotImplementedError                       Traceback (most recent call last)
<ipython-input-4-99efa4bdc06e> in <module>()
      1 
----> 2 model.save('epic_num_reader.model')

NotImplementedError: Currently `save` requires model to be a graph network. Consider using `save_weights`, in order to save the weights of the model.

Alors, comment puis-je sauvegarder le modèle défini dans le code?

6
Evan-Gao

Vous avez oublié l'argument input_shape dans la définition de la première couche, ce qui rend le modèle non défini et l'enregistrement des modèles non définis n'a pas encore été implémenté, ce qui déclenche l'erreur.

model.add(tf.keras.layers.Flatten(input_shape = (my, input, shape)))

Ajoutez simplement le input_shape à la première couche et cela devrait fonctionner correctement.

8
Matias Valdenegro

Pour ceux qui n'ont toujours pas résolu le problème, même comme l'a suggéré Matias, vous pouvez envisager d'utiliser tf.keras.models.save_model() et load_model(). Dans mon cas, cela a fonctionné.

1
Hauru Kachinga
tf.keras.models.save_model

Fonctionne ici (tensorflow 1.12.0) (même lorsque la forme_entrée n'est pas spécifiée)

0
olejorgenb

Raison de l'erreur:

J'avais la même erreur et j'ai essayé les réponses ci-dessus, mais j'ai eu des erreurs. Mais je trouve une solution au problème que je vais partager ci-dessous:

Vérifiez si vous avez transmis input_shape lors de la définition de la couche d'entrée du modèle, sinon vous obtiendrez une erreur lors de l'enregistrement et du chargement du modèle.

Comment définir input_shape?

Considérons l'exemple suivant Si vous utilisez le jeu de données minst:

mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

Il consiste en des images de chiffres manuscrits de 0 à 9 de résolution 28 x 28 chacun ..__ Pour cela, nous pouvons définir la forme d'entrée comme (28,28) sans mentionner la taille du lot de la manière suivante:

model.add(tf.keras.layers.Flatten(input_shape=(28,28)))

De cette façon, vous pouvez donner forme à l’entrée en consultant votre ensemble de données d’entraînement.

Enregistrez votre modèle formé:

Maintenant, après avoir formé et testé le modèle, nous pouvons enregistrer notre modèle. Le code suivant a fonctionné pour moi mais il n’a pas changé l’exactitude après le rechargement du modèle:

en utilisant save_model ()

import tensorflow as tf    
tf.keras.models.save_model(
    model,
    "your_trained_model.model",
    overwrite=True,
    include_optimizer=True
) 

en utilisant .save ()

your_trained_model.save('your_trained_model.model')

del model  # deletes the existing model

Chargez maintenant le modèle que nous avons sauvegardé:

model2 = tf.keras.models.load_model("your_trained_model.model")

Pour plus de détails, consultez ce lien: Explication d’entrée Keras: input_shape, unités, batch_size, dim, etc.

0
Yogesh