CNTK 'metric' 显示错误的分类准确度
CNTK 'metric' displaying wrong accuracy on classification
我从 CNTK 的 trainer/progress 作者那里得到的输出告诉我我的准确率 > 99%,而实际上它大约是 0.5%。根据 指标确实意味着损失,但如果我知道我以某种方式错误地使用了 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)
问题是标签 var 数据没有预期的属性。
对于cross_entropy_with_softmax
它必须代表一个概率分布,通常是one-hot编码。
对于classification_error
,必须是one-hot编码。
因此,如果您更改 Y
数据,使其每行恰好有一个 1,您将获得准确度 = 100% - 指标。
我从 CNTK 的 trainer/progress 作者那里得到的输出告诉我我的准确率 > 99%,而实际上它大约是 0.5%。根据
下面是示例输出的示例(不同于我的模型,但产生类似的效果):
-------------------------------------------------------------------
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)
问题是标签 var 数据没有预期的属性。
对于cross_entropy_with_softmax
它必须代表一个概率分布,通常是one-hot编码。
对于classification_error
,必须是one-hot编码。
因此,如果您更改 Y
数据,使其每行恰好有一个 1,您将获得准确度 = 100% - 指标。