我正在编写本教程:
https://github.com/Microsoft/CNTK/blob/master/Tutorials/CNTK_201B_CIFAR-10_ImageHandsOn.ipynb
测试/训练数据文件是简单的制表符分隔文本文件,包含图像文件名和正确的标签,如下所示:
...\data\CIFAR-10\test\00000.png 3
...\data\CIFAR-10\test\00001.png 8
...\data\CIFAR-10\test\00002.png 8
如何从小批量中提取原始标签?
我尝试过这段代码:
reader_test = MinibatchSource(ImageDeserializer('test_map.txt', StreamDefs(
features = StreamDef(field='image', transforms=transforms), # first column in map file is referred to as 'image'
labels = StreamDef(field='label', shape=num_classes) # and second as 'label'
)))
test_minibatch = reader_test.next_minibatch(10)
labels_stream_info = reader_test['labels']
orig_label = test_minibatch[labels_stream_info].value
print(orig_label)
<cntk.cntk_py.Value; proxy of <Swig Object of type 'CNTK::ValuePtr *' at 0x0000000007A32C00> >
但是,如上所示,结果不是带有标签的数组。
获取标签的正确代码是什么?
此代码有效,但它使用的是不同的文件格式,而不是ImageDeserializer。
文件格式:
|labels 0 0 1 0 0 0 |features 0
|labels 1 0 0 0 0 0 |features 457
工作代码:
mb_source = text_format_minibatch_source('test_map2.txt', [
StreamConfiguration('features', 1),
StreamConfiguration('labels', num_classes)])
test_minibatch = mb_source.next_minibatch(2)
labels_stream_info = mb_source['labels']
orig_label = test_minibatch[labels_stream_info].value
print(orig_label)
[[[ 0. 0. 1. 0. 0. 0.]]
[[ 1. 0. 0. 0. 0. 0.]]]
使用ImageDeserializer时,如何获取输入中的标签?
答案 0 :(得分:2)
您可以尝试使用:
orig_label = test_minibatch[labels_stream_info].value
答案 1 :(得分:1)
我只是试图重复 - 我认为这里潜伏着一些奇怪的错误。我的预感是,实际上labels
对象不会作为有效的numpy
数组返回。我将以下调试输出插入到教程train_and_evaluate
中的CNTK_201B
函数中:
for epoch in range(max_epochs): # loop over epochs
sample_count = 0
while sample_count < epoch_size: # loop over minibatches in the epoch
data = reader_train.next_minibatch(min(minibatch_size, epoch_size - sample_count), input_map=input_map) # fetch minibatch.
print("Features:")
print(data[input_var].shape)
print(data[input_var].value.shape)
print("Labels:")
print(data[label_var].shape)
print(data[label_var].value.shape)
输出:
Training 116906 parameters in 10 parameter tensors.
Features:
(64, 1, 3, 32, 32)
(64, 1, 3, 32, 32)
Labels:
(64, 1, 10)
()
标签显示为numpy.ndarray
,但没有有效的shape
。
我称之为一个错误。