我使用一个相当标准的softmax输出,用MXNet模型预测大约100K个可能输出中的一个。我想比较分配给真标签的概率和模型下的最高预测。为了得到前者,我使用pick操作符;后者,我尝试了廉价版本(topk操作符)和昂贵版本(sort/argsort+slice)。
在这两种情况下,我得到了矛盾的结果。具体地说,有许多情况下,真实标签(使用pick检索)的概率明显高于最高概率输出(使用topk/sort检索)。我想这意味着我做错了什么,但我不明白。这并不是所有的预测都会发生,但有相当一部分预测会发生。
有人能告诉我发生了什么事吗?
代码如下:
for batch in data_iter:
model.forward(batch, is_train=False)
predictions = model.get_outputs()[0]
labels = batch.label[0].as_in_context(predictions.context)
# scores = mx.nd.topk(predictions, axis=1, k=6, ret_typ='value')
scores = mx.nd.sort(predictions, axis=1, is_ascend=0)
scores = mx.nd.slice_axis(scores, axis=1, begin=0, end=6)
label_score = mx.nd.pick(predictions, labels, axis=1)
equal = label_score.asnumpy() <= scores.asnumpy()[:, 0]
if not np.all(equal):
#I think this should never happen but it does frequently
最佳答案
使用MXNet 1.1.0进行测试时,以下代码表明问题没有发生:
for _ in range(10):
predictions = nd.random.uniform(shape=(100, 100000))
labels = nd.array(np.random.randint(0, 99999, size=(100, 1)))
scores = mx.nd.sort(predictions, axis=1, is_ascend=0)
scores = mx.nd.slice_axis(scores, axis=1, begin=0, end=6)
label_score = mx.nd.pick(predictions, labels, axis=1)
equal = label_score.asnumpy() <= scores.asnumpy()[:, 0]
if not np.all(equal):
print("ERROR")