我從CNTK的培訓(xùn)師/進(jìn)步作家那里得到了輸出,告訴我,我的準(zhǔn)確度> 99%,而實際上是0.5%左右。根據(jù)這個指標(biāo)的確意味著損失,但是得知我不正確地使用了CNTK的訓(xùn)練器/損失功能并不奇怪,這并不會讓我感到驚訝。這是下面示例的示例輸出(與我的模型不同,但產(chǎn)生了相似的效果):-------------------------------------------------------------------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這是一個最小的工作示例,演示了真實準(zhǔn)確度與度量標(biāo)準(zhǔn)所報告的真實度之間的差異。我編寫了一個小的精度函數(shù)來對其進(jìn)行測試,我敢肯定它可以正確實現(xiàn)。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貢獻(xiàn)1825條經(jīng)驗 獲得超6個贊
問題在于標(biāo)簽var數(shù)據(jù)不具有預(yù)期的屬性。
因為cross_entropy_with_softmax
它必須表示一個概率分布,通常是單熱編碼。
因為classification_error
它必須是一鍵編碼。
因此,如果更改Y
數(shù)據(jù)以使每行中的數(shù)據(jù)恰好為1,那么您將獲得準(zhǔn)確性= 100%-指標(biāo)。
添加回答
舉報
0/150
提交
取消