2017-08-19 42 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? –