cntk 中的 eval 和 test_minibatch
eval and test_minibatch in 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 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(data) returns% 的错误结果,这两种方法应该会给出相似的结果。我的问题是:
- trainer.test_minibatch(数据)return是什么?
- 对于CIFAR-10测试图像,两种方法的差异在10%以内,但对于我们自己的样本图像,有64x64x3和4类,差异超过100%。是什么导致了巨大的差异?
- 如果我们直接将训练器传递给 calc_error,它会在评估期间出错。我们必须在调用 calc_error 之前先保存和 load_model,为什么?
trainer.test_minibatch
returns 损失的平均值(或者通常是第一个参数)。
调用test_minibatch
后还有这些方法可以使用:
trainer.previous_minibatch_loss_average
、trainer.previous_minibatch_sample_count
和 trainer.previous_minibatch_evaluation_average
。
差异可能来自预处理。 mean_value
和你训练网络时一样吗?是RGB顺序还是BGR顺序?
您是否考虑过将评估集缩减为单个图像并验证您使用 reader 和手动加载图像得到的输出完全相同?
我们以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
我们认为 test_minibatch(data) returns% 的错误结果,这两种方法应该会给出相似的结果。我的问题是:
- trainer.test_minibatch(数据)return是什么?
- 对于CIFAR-10测试图像,两种方法的差异在10%以内,但对于我们自己的样本图像,有64x64x3和4类,差异超过100%。是什么导致了巨大的差异?
- 如果我们直接将训练器传递给 calc_error,它会在评估期间出错。我们必须在调用 calc_error 之前先保存和 load_model,为什么?
trainer.test_minibatch
returns 损失的平均值(或者通常是第一个参数)。
调用test_minibatch
后还有这些方法可以使用:
trainer.previous_minibatch_loss_average
、trainer.previous_minibatch_sample_count
和 trainer.previous_minibatch_evaluation_average
。
差异可能来自预处理。 mean_value
和你训练网络时一样吗?是RGB顺序还是BGR顺序?
您是否考虑过将评估集缩减为单个图像并验证您使用 reader 和手动加载图像得到的输出完全相同?