1

J'ai écrit un script pour faire la classification d'une seule image d'entrée en utilisant un modèle que j'ai entraîné avec MxNet. Pour classifier l'image entrante, je les transfère dans le réseau.MxNet: les formes d'étiquettes ne correspondent pas aux noms spécifiés par label_names

Bref voici ce que je fais:

symbol, arg_params, aux_params = mx.model.load_checkpoint('model-prefix', 42) 
model = mx.mod.Module(symbol=symbol, context=mx.cpu()) 
model.bind(data_shapes=[('data', (1, 3, 224, 244))], for_training=False) 
model.set_params(arg_params, aux_params) 

# ... loading the image & resizing ... 
# img is the image to classify as numpy array of shape (3, 244, 244) 

Batch = namedtuple('Batch', ['data']) 
self._model.forward(Batch(data=[mx.nd.array(img)])) 
probabilities = self._model.get_outputs()[0].asnumpy() 

print(str(probabilities)) 

Cela fonctionne très bien, sauf que je reçois l'avertissement suivant

UserWarning: Data provided by label_shapes don't match names specified by label_names ([] vs. ['softmax_label']) 

Que dois-je changer pour éviter d'avoir cet avertissement? Il n'est pas clair pour moi à quoi servent les paramètres label_shapes et étiquette_names, et ce à quoi je m'attends pour les remplir.

Note: J'ai trouvé du fil à leur sujet, mais aucun ne m'a permis de résoudre le problème. De même, la documentation MxNet ne fournit pas beaucoup de détails sur ce que sont ces paramètres et sur la façon dont ils sont censés être remplis.

Répondre

2

Définissez label_names=None et allow_missing=True. Cela devrait se débarrasser de l'avertissement.

model = mx.mod.Module(symbol=symbol, context=mx.cpu(), label_names=None) 
... 
model.set_params(arg_params, aux_params, allow_missing=True) 

Si vous êtes curieux de savoir pourquoi l'avertissement est imprimé en premier lieu,

Chaque module a étiquette associée. Lorsque ce modèle a été formé, softmax_label a été utilisé comme étiquette (probablement parce que la couche de sortie était une couche softmax appelée «softmax»). Lorsque le modèle a été chargé à partir du fichier, le module créé avait softmax_label comme libellé du module.

>>>print(model.label_names) 
['softmax_label'] 

model.bind est alors appelé sans fournir label_shapes.

model.bind(data_shapes=[('data', (1, 3, 224, 244))], for_training=False) 

MXNet voit que le module a une étiquette dans ce qui n'a pas été fourni lors de se lier et se plaint à ce sujet - qui est le message d'avertissement vous voyez.

Je pense que si bind est appelé avec for_training=False, MXNet ne devrait pas se plaindre de l'étiquette manquante. J'ai cependant créé ce problème: https://github.com/dmlc/mxnet/issues/6958

Cependant, pour ce cas particulier où nous chargeons un modèle à partir du disque, nous pouvons le charger avec None comme étiquette afin que MXNet ne se plaint pas plus tard lorsque bind ne fournit pas d'étiquette - qui est ce que le correctif suggéré fait.

+0

Merci pour l'aide. J'ai essayé ça. Il supprime l'avertissement mais le script ne fonctionne plus. Avec 'label_name = None' le script échoue maintenant avec' RuntimeError: softmax_label n'est pas présenté'. Il vient de 'Fichier" /usr/local/lib/python2.7/site-packages/mxnet-0.9.5-py2.7.egg/mxnet/module/module.py ", ligne 264, dans _impl raise RuntimeError ("% s n'est pas présenté"% name) 'Une idée de ce qui se passe? Je suis un peu désemparé sur la signification de ces différents paramètres d'étiquette. –

+0

Pouvez-vous définir 'allow_missing = True' pour le module? 'model.set_params (arg_params, aux_params, allow_missing = True)' –

+0

Merci @ indhu-bharathi pour la réponse et l'explication. Ajoutant aussi allow_missing à true fait marcher. –