为了账号安全,请及时绑定邮箱和手机立即绑定

CNTK“度量标准”在分类上显示错误的准确性

CNTK“度量标准”在分类上显示错误的准确性

Qyouu 2021-04-03 17:12:01
我从CNTK的培训师/进步作家那里得到了输出,告诉我,我的准确度> 99%,而实际上是0.5%左右。根据这个指标的确意味着损失,但是得知我不正确地使用了CNTK的训练器/损失功能并不奇怪,这并不会让我感到惊讶。这是下面示例的示例输出(与我的模型不同,但产生了相似的效果):-------------------------------------------------------------------Finished Epoch[1 of 20]: [Training] loss = 2.302585 * 100, metric = 48.10% * 100 0.802s (124.7 samples/s);Accuracy % 11.0Finished 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 Cimport numpy as npfrom cntk.ops import relufrom cntk.layers import Dense, Convolution2DminibatchSize = 100def 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 = 10input_var = C.input_variable((7, 19, 19), name='features')label_var = C.input_variable((outputs))epochs = 20cc = 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)
查看完整描述

1 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

问题在于标签var数据不具有预期的属性。

因为cross_entropy_with_softmax它必须表示一个概率分布,通常是单热编码。

因为classification_error它必须是一键编码。

因此,如果更改Y数据以使每行中的数据恰好为1,那么您将获得准确性= 100%-指标。


查看完整回答
反对 回复 2021-04-20
  • 1 回答
  • 0 关注
  • 156 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信