web-dev-qa-db-fra.com

"KeyError: 0" lors de la tentative de chargement d'un modèle séquentiel dans Keras

J'ai formé un modèle séquentiel à Keras en utilisant Google Colab pour travailler sur l'ensemble de données Google Doodle. Je fais une classification d'image simple ici.

La fonction suivante définit l'architecture de mon modèle:

def create_model(input_shape):
   model = keras.Sequential()  
   model.add(layers.Conv2D(16, (3, 3), padding = 'same', input_shape = input_shape, activation = 'relu'))
   model.add(layers.BatchNormalization(axis = 3)) 
   model.add(layers.MaxPooling2D(pool_size = (2, 2)))

   model.add(layers.Conv2D(32, (3, 3), padding = 'same', activation = 'relu'))
   model.add(layers.BatchNormalization(axis = 3))
   model.add(layers.MaxPooling2D(pool_size = (2, 2)))

   model.add(layers.Conv2D(64, (3, 3), padding = 'same', activation = 'relu'))
   model.add(layers.BatchNormalization(axis = 3))
   model.add(layers.MaxPooling2D(pool_size = (2,2)))

   model.add(layers.Flatten())
   model.add(layers.Dense(128, activation = 'relu'))
   model.add(layers.Dense(28, activation = 'softmax')) 

   return model

et le morceau de code suivant le crée, le compile et l'adapte:

doodle_model = create_model((image_size, image_size, 1)) #image_size = 28
doodle_model.compile (optimizer = "Adam", loss = "categorical_crossentropy", metrics = ["accuracy"])
doodle_model.fit (x = X_train, y = Y_train, epochs = 4, batch_size = 256)

J'obtenais de bons résultats avec ce modèle et j'ai donc décidé de l'enregistrer pour le déployer plus tard dans une application Web. J'ai utilisé:

doodle_model.save("my_model.h5")

pour enregistrer le modèle

Cependant, lorsque j'ai essayé de charger à nouveau le modèle avec un:

from keras.models import load_model
model = load_model ("my_model.h5")

pour m'assurer qu'il est enregistré correctement, j'obtiens l'erreur suivante ...

KeyError                                  Traceback (most recent call last)
<ipython-input-61-6cde554a8add> in <module>()
      1 from keras.models import load_model
      2 
----> 3 model = load_model ("my_model.h5")

/usr/local/lib/python3.6/dist-packages/keras/models.py in load_model(filepath, custom_objects, compile)
    268             raise ValueError('No model found in config file.')
    269         model_config = json.loads(model_config.decode('utf-8'))
--> 270         model = model_from_config(model_config, custom_objects=custom_objects)
    271 
    272         # set weights

/usr/local/lib/python3.6/dist-packages/keras/models.py in model_from_config(config, custom_objects)
    345                         'Maybe you meant to use '
    346                         '`Sequential.from_config(config)`?')
--> 347     return layer_module.deserialize(config, custom_objects=custom_objects)
    348 
    349 

/usr/local/lib/python3.6/dist-packages/keras/layers/__init__.py in deserialize(config, custom_objects)
     53                                     module_objects=globs,
     54                                     custom_objects=custom_objects,
---> 55                                     printable_module_name='layer')

/usr/local/lib/python3.6/dist-packages/keras/utils/generic_utils.py in deserialize_keras_object(identifier, module_objects, custom_objects, printable_module_name)
    142                 return cls.from_config(config['config'],
    143                                        custom_objects=dict(list(_GLOBAL_CUSTOM_OBJECTS.items()) +
--> 144                                                            list(custom_objects.items())))
    145             with CustomObjectScope(custom_objects):
    146                 return cls.from_config(config['config'])

/usr/local/lib/python3.6/dist-packages/keras/models.py in from_config(cls, config, custom_objects)
   1404     @classmethod
   1405     def from_config(cls, config, custom_objects=None):
-> 1406         if 'class_name' not in config[0] or config[0]['class_name'] == 'Merge':
   1407             return cls.legacy_from_config(config)
   1408 

KeyError: 0

Pour autant que je sache, les KeyErrors sont liés aux dictionnaires python mais je ne sais pas pourquoi je rencontre une KeyError ici. Toute aide expliquant pourquoi j'obtiens cette erreur et comment la résoudre) serait grandement apprécié.

Chaque morceau de code, après la ligne

----> 3 model = load_model ("my_model.h5")

de ce message d'erreur est un code interne de Keras et n'est pas écrit par moi.

5
Sudeepam Pandey

Quelle version de Keras utilisez-vous? Si c'est 2.1.6 alors essayez Keras 2.2.4 ou plus récent et votre problème aura disparu. Cela m'est arrivé.

1
agcala