2017-08-19 44 views
1

我們以TrainResNet_CIFAR10.py爲例來學習cntk。我們已經創建了兩個方法,eval_metric和calc_error如下:eval and test_minibatch in cntk

def eval_metric(trainer, reader_test, test_epoch_size, label_var, input_map) : 
    # Evaluation parameters 
    minibatch_size = 16 

    # process minibatches and evaluate the model 
    metric_numer = 0 
    metric_denom = 0 
    sample_count = 0 

    while sample_count < test_epoch_size: 
     current_minibatch = min(minibatch_size, test_epoch_size - sample_count) 
     # Fetch next test min batch. 
     data = reader_test.next_minibatch(current_minibatch, input_map=input_map) 
     # minibatch data to be trained with 
     metric_numer += trainer.test_minibatch(data) * current_minibatch 
     metric_denom += current_minibatch 
     # Keep track of the number of samples processed so far. 
     sample_count += data[label_var].num_samples 

    return metric_numer/metric_denom 

def calc_error(trainer, fileList, mean_value, test_size) : 
    if (len(fileList) != test_size) : 
     return 0 

    n = 0 
    m = 0 
    while n < test_size: 
     c = evalute(trainer, fileList[n].filename, mean_value); 
     if (c != fileList[n].classID) : 
      m += 1 
     n += 1 

    return m/test_size 

def evalute(trainer, img_name, mean_value) : 
    rgb_image = np.asarray(Image.open(img_name), dtype=np.float32) - mean_value 
    bgr_image = rgb_image[..., [2, 1, 0]] 
    pic = np.ascontiguousarray(np.rollaxis(bgr_image, 2)) 
    probs = trainer.eval({trainer.arguments[0]:[pic]}) 
    predictions = np.squeeze(probs) 
    top_class = np.argmax(predictions) 
    return top_class 

我們認爲test_minibatch(數據)返回不正確的結果%,而這兩種方法應該給出類似的結果。我的問題是: 1. trainer.test_minibatch(data)返回什麼? 2.對於CIFAR-10測試圖像,兩種方法之間的差異在10%以內,但對於我們自己的具有64x64x3和4類的樣本圖像,差異超過100%。什麼可能導致巨大的差異? 3.如果我們直接將訓練者傳遞給calc_error,則會在eval期間發生錯誤。我們必須在調用calc_error之前先保存並load_model,爲什麼?

回答

0

trainer.test_minibatch返回損失的平均值(或通常第一個參數)。

也有這些方法,你可以調用test_minibatch後使用: trainer.previous_minibatch_loss_averagetrainer.previous_minibatch_sample_counttrainer.previous_minibatch_evaluation_average

差異可能來自預處理。 mean_value與培訓網絡時相同嗎?它是RGB順序還是BGR順序?

您是否考慮過將您的評估集縮小到單個圖像並驗證您是否與閱讀器獲得完全相同的輸出並手動加載圖像?

+0

尼科斯,很高興知道!我試過在test_minibatch之後調用trainer.previous_minibatch_evaluation_average 和trainer.previous_minibatch_loss_average,但我得到了「此Value對象無效並且不能再被訪問」異常。什麼可能導致這個錯誤?我在列車和測試中都使用了相同的mean_value,並嘗試了RGB和BGR順序,但得到了相似的結果:calc_error給出的誤差比eval_metric大得多。我們應該在mean_value中使用RGB還是BGR順序?通過將評估設置爲單個圖像,您的意思是什麼 - 您的意思是將minibatch_size設置爲1? –

+0

「無效」錯誤是當您嘗試從以前的小批次訪問某些內容時。不知道你爲什麼這樣做。如果網絡使用CNTK的閱讀器進行培訓,則需要BGR訂單。如果您自己進行培訓,則取決於數據的加載方式。我不是說將minibatch_size設置爲1,我的意思是在你的測試集中有一個圖像,直到你得到與所有方法相同的結果。 –

+0

好!如果用CNTK的讀者進行培訓,你的意思是在火車上mean_value應該是BGR順序嗎?反正有沒有先保存和load_model來調用trainer.eval? –