CNTK“metric”显示错误的分类精度

2024-04-20 07:50:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我从CNTK的培训师/进度报告员那里得到的结果告诉我,我的准确率是99%,而实际上是0.5%左右。根据this度量确实意味着损失,但如果我知道我不正确地使用了CNTK的trainer/loss函数,我也不会感到惊讶。你知道吗

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

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

Tags: importinputnetvarnptraining精度outputs
1条回答
网友
1楼 · 发布于 2024-04-20 07:50:49

问题是标签var数据没有预期的属性。你知道吗

对于cross_entropy_with_softmax,它必须表示一个概率分布,通常是一个热编码。你知道吗

对于classification_error它必须是一个热编码。你知道吗

因此,如果您更改Y数据,使其每行正好有一个1,那么您将得到精度=100%的度量。你知道吗

相关问题 更多 >