Python 评估和测试cntk中的小批量

Python 评估和测试cntk中的小批量,python,deep-learning,cntk,Python,Deep Learning,Cntk,我们以TrainResNet_CIFAR10.py为例学习cntk。我们创建了两种方法,eval_metric和calc_error,如下所示: def eval_metric(trainer, reader_test, test_epoch_size, label_var, input_map) : # Evaluation parameters minibatch_size = 16 # process minibatches and evaluate the mo

我们以TrainResNet_CIFAR10.py为例学习cntk。我们创建了两种方法,eval_metric和calc_error,如下所示:

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
def eval_度量(培训师、读卡器测试、测试年代大小、标签变量、输入地图):
#评价参数
小批量_尺寸=16
#处理小批量并评估模型
公制单位数值=0
度量值=0
样本计数=0
当样本数量<测试时间大小时:
当前\u小批量=最小(小批量大小、测试\u大小-样本计数)
#获取下一个测试最小批。
数据=读卡器\测试。下一个\小批量(当前\小批量,输入\映射=输入\映射)
#要使用进行培训的小批量数据
公制\u数字+=培训师测试\u小批量(数据)*当前\u小批量
metric_denom+=当前_小批量
#跟踪到目前为止处理的样本数量。
样本数+=数据[标签变量].num\u样本数
返回度量值\数字/度量值\名称
def校准错误(培训师、文件列表、平均值、测试大小):
如果(len(fileList)!=测试大小):
返回0
n=0
m=0
当n<试验尺寸时:
c=评估值(培训师,文件列表[n]。文件名,平均值);
如果(c!=文件列表[n].classID):
m+=1
n+=1
返回m/测试单位大小
def评估(培训师、img_名称、平均值):
rgb_image=np.asarray(image.open(img_名称),dtype=np.float32)-平均值
bgr_图像=rgb_图像[…,[2,1,0]]
pic=np.ascontiguousarray(np.rollaxis(bgr_图像,2))
probs=trainer.eval({trainer.arguments[0]:[pic]})
预测=np.挤压(问题)
top_class=np.argmax(预测)
返回头等舱
我们认为test_minibatch(data)返回错误结果的百分比,这两种方法应该给出相似的结果。我的问题是:

  • trainer.test\u小批量(数据)返回什么
  • 对于CIFAR-10测试图像,两种方法之间的差异在10%以内,但对于我们自己的样本图像(具有64x64x3和4类),差异超过100%。是什么导致了巨大的差异
  • 如果我们将培训师直接传递给calc_error,则在评估过程中会给出错误。在调用calc_错误之前,我们必须先保存并加载_模型,为什么

  • trainer.test\u minibatch
    返回损失的平均值(通常是第一个参数)

    调用
    test\u minibatch
    后,也可以使用以下方法:
    trainer.先前的\u小批量\u损失\u平均值
    trainer.先前的\u小批量\u样本\u计数
    ,以及
    trainer.先前的\u小批量\u评估\u平均值

    差异可能来自预处理。
    平均值是否与训练网络时相同?是RGB顺序还是BGR顺序


    您是否考虑过将评估集缩减为单个图像,并通过手动加载图像来验证您与读取器获得的输出是否完全相同?

    trainer.test\u minibatch
    返回损失的平均值(通常是第一个参数)

    调用
    test\u minibatch
    后,也可以使用以下方法:
    trainer.先前的\u小批量\u损失\u平均值
    trainer.先前的\u小批量\u样本\u计数
    ,以及
    trainer.先前的\u小批量\u评估\u平均值

    差异可能来自预处理。
    平均值是否与训练网络时相同?是RGB顺序还是BGR顺序


    您是否考虑过将评估集缩小为一张图像,并通过手动加载图像来验证您与阅读器获得的输出是否完全相同?

    Nikos,很高兴知道!我尝试在测试后立即调用trainer.previous\u minibatch\u evaluation\u average和trainer.previous\u minibatch\u loss\u average,但我得到“此值对象无效且无法再访问”异常。什么可能导致此错误?我在训练和测试中使用了相同的平均值,并尝试了RGB和BGR顺序,但得到了相似的结果:计算误差给出的误差比评估误差要大得多。我们应该在平均值中使用RGB或BGR顺序吗?您将评估集缩减为单个图像是什么意思?您的意思是将minibatch_size设置为1吗?当您尝试从以前的minibatch中访问某些内容时,会出现“无效”错误。不知道你为什么会得到这个。如果网络是用CNTK的阅读器训练的,你需要BGR订单。如果你自己训练它,这取决于数据的加载方式。我不是说将minibatch_size设置为1,我是说在测试集中只有一个图像,直到所有方法都得到相同的结果。很好!你的意思是,如果使用CNTK的读卡器进行训练,训练期间的平均值也应该是BGR顺序吗?是否有必要在不保存和加载_model的情况下调用trainer.eval?ImageDeserializer会按bgr顺序加载数据,以便训练网络在bgr图像上表现良好。因此,正确的减法平均值将在训练和测试中按bgr排序。关于你的另一个问题。您可以在没有任何培训师的情况下对模型本身调用eval。def verify_metric(z,fileList,mean_value):test_size=len(fileList)cm=0.0n=0,而n