MxNet:label_shapes与label_names指定的名称不匹配

时间:2017-07-06 11:01:57

标签: python machine-learning computer-vision deep-learning mxnet

我编写了一个脚本,使用我用MxNet训练的模型对单个输入图像进行分类。为了对传入的图像进行分类,我通过网络将它们前馈。

总之,这就是我在做的事情:

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))

这项工作正常,但我收到以下警告

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

我应该更改哪些内容以避免收到此警告?我不清楚 label_shapes label_names 参数的含义是什么,而我期望用它来填补它们。

注意:我找到了一些关于它们的帖子,但没有一个能让我解决问题。类似地,MxNet文档没有提供有关这些参数是什么以及如何填充这些参数的详细信息。

1 个答案:

答案 0 :(得分:3)

设置label_names=Noneallow_missing=True。那应该摆脱警告。

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

如果您很好奇为什么首先打印警告

每个模块都有相关标签。在训练此模型时,softmax_label被用作标签(很可能是因为输出层是名为'softmax'的softmax层)。从文件加载模型时,创建的模块将softmax_label作为模块的标签。

>>>print(model.label_names)
['softmax_label']
然后在不提供label_shapes的情况下调用

model.bind

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

MXNet发现该模块中有一个标签,在绑定期间没有提供并抱怨它 - 这是您看到的警告消息。

我认为如果使用for_training=False调用bind,MXNet不应该抱怨丢失的标签。我已经创建了这个问题:https://github.com/dmlc/mxnet/issues/6958

但是,对于我们从磁盘加载模型的特殊情况,我们可以使用None作为标签加载它,这样当绑定不提供标签时MXNet不会再抱怨 - 这就是建议修复。