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.
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é.