我是MXNet的新手,想要解决一个使用1层网络解决数字分类问题的简单例子。我的程序如下:
导入数学导入numpy为np将mxnet导入为mx…
的 TLDR; 强>
如果您停止进行单热编码,则可以解决此问题。
而不是传递标签[0:15000],标签[15000:16000]和标签[16000:18720]传递标签[0:15000],标签[15000:16000]和标签[16000:18720]。
这会使您的准确度在适当的评估标签上降至0.796000,在“随机”评估标签上降至0.095000。
的 详细的答案 强>
由于误导了mxnet.metric.Accuracy的计算,您获得了如此高的准确性。在内部,Accuracy指标可以在2种“模式”下工作,具体取决于提供的参数“preds”和“labels”的形状:
例如,如果你有preds = [[0.1,0.9],[0.8,0.2]]那么它意味着:
在这种模式下工作,“标签”应该是一个真实类的数组。在我们的例子中,想象模型绝对正确,“标签”数组应该是[1,0]。
2)如果“preds”和“labels”的形状匹配,则Accuracy将数组视为预测类和实数类。因此,每个项目都被视为一个样本的一类。然后计算作为“preds”“标签”中具有相同索引的项目的比较。
将单热编码应用于标签时,将使用第二种计算模式,因为模型中预测的形状与一热编码的形状相匹配。精度将数组中的每个项目解释为独立样本,并将它们相互比较。
在内部, 精度将float数组转换为int ,对于小于1的浮点数总是产生0.该行为实质上将所有预测转换为0,除了罕见的情况,当存在1.0概率的类时。所以在大多数情况下我们得到preds = [0,0,...,0]。
单热编码数组除了一个等于0之外的所有项目。意思是我们会有类似[0,1,0,...,0]的东西。
当精确度比较这两个阵列时,它发现它们大部分是相同的,除了一个地方,返回错误的高精度。
这是一个简单的再现示例:
import mxnet as mx predicts = mx.nd.array([[1.29206967e-09, 3.40120096e-05, 2.23299547e-12, 3.98692492e-07, 1.21151755e-10, 2.59370694e-08, 1.95488334e-02, 1.13474562e-05, 9.80405331e-01, 3.51648767e-12]]) labels = mx.nd.array([[0, 0, 0, 0, 0, 0, 0, 0, 1, 0]]) acc = mx.metric.Accuracy() acc.update(preds=predicts, labels=labels) print(acc.get())
这会给我们
('accuracy', 0.90000000000000002)
因为单热编码恰好包含1个非零元素。