【问题标题】:CNTK 'metric' displaying wrong accuracy on classificationCNTK“指标”在分类上显示错误的准确性
【发布时间】:2018-07-01 05:38:35
【问题描述】:

我从 CNTK 的培训师/进度作者那里得到输出,告诉我我的准确率 > 99%,而实际上它在 0.5% 左右。根据this 指标确实意味着损失,但如果我知道我以某种方式错误地使用了 CNTK 的训练器/损失函数,我不会感到惊讶。

这是来自下面示例的示例输出(与我的模型不同,但产生类似的效果):

-------------------------------------------------------------------
Finished Epoch[1 of 20]: [Training] loss = 2.302585 * 100, metric = 48.10% * 100 0.802s (124.7 samples/s);
Accuracy % 11.0
Finished Epoch[2 of 20]: [Training] loss = 2.302514 * 100, metric = 49.82% * 100 0.043s (2325.6 samples/s);
Accuracy % 15.0

这是一个最小的工作示例,演示了实际准确度与度量报告的准确度之间的差异。我写了一个小的精度函数来测试它,我很确定它是正确实现的。

import cntk as C
import numpy as np
from cntk.ops import relu
from cntk.layers import Dense, Convolution2D

minibatchSize = 100

def printAccuracy(net, X, Y):
    outs = net(X)
    pred = np.argmax(Y, 1)
    indx = np.argmax(outs, 1)
    same = pred == indx
    print("Accuracy %", np.sum(same)/minibatchSize*100)


outputs = 10

input_var = C.input_variable((7, 19, 19), name='features')
label_var = C.input_variable((outputs))

epochs = 20

cc = C.layers.Convolution2D((3,3), 64, activation=relu)(input_var)
net = C.layers.Dense(outputs)(cc)

loss = C.cross_entropy_with_softmax(net, label_var)
pe = C.classification_error(net, label_var)    

learner = C.adam(net.parameters, 0.0018, 0.9, minibatch_size=minibatchSize)

progressPrinter = C.logging.ProgressPrinter(tag='Training', num_epochs=epochs)
trainer = C.Trainer(net, (loss, pe), learner, progressPrinter)    

for i in range(epochs):
    X = np.zeros((minibatchSize, 7, 19, 19), dtype=np.float32)
    Y = np.random.rand(minibatchSize, outputs)

    trainer.train_minibatch({input_var : X, label_var : Y})    
    trainer.summarize_training_progress()
    printAccuracy(net, X, Y)

【问题讨论】:

    标签: python cntk


    【解决方案1】:

    问题是标签 var data 没有预期的属性。

    对于cross_entropy_with_softmax,它必须代表一个概率分布,通常是单热编码。

    对于classification_error,它必须是 one-hot 编码。

    因此,如果您更改您的 Y 数据,使其每行恰好有一个 1,您将获得准确度 = 100% - 度量。

    【讨论】:

    • 好的,有道理。不幸的是,我在示例中搞砸了,我的 Y 是一个热编码(只有一个 Y 数组的值被设置为 1(这是一个热的,对吗?)),我仍然得到几乎完全相反的指标打印出来。 IE 如果我的准确度函数显示我得到了 10% 的正确率,那么指标显示在 88-92% 之间
    • 哎呀,我错过了你说的地方。谢谢,这很有意义。只是出于好奇(现在我知道有些事情没有错,它并不那么重要)有没有办法让进度打印机打印精度?
    • 是的,您可以定义指标来报告准确性而不是错误:pe = C.element_not(C.classification_error(net, label_var))
    猜你喜欢
    • 1970-01-01
    • 2016-01-12
    • 2021-07-23
    • 1970-01-01
    • 2016-05-12
    • 2012-09-22
    • 2010-11-13
    • 2017-03-13
    • 1970-01-01
    相关资源
    最近更新 更多