Как получить этикетки из минибатча?

Я работаю над этим учебником:

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?


person OlavT    schedule 05.01.2017    source источник


Ответы (2)


Можете ли вы попробовать использовать:

orig_label = test_minibatch[labels_stream_info].value
  • value : значение минипакета в виде массива NumPy. CNTK MinibatchData
person Morgan Funtowicz    schedule 05.01.2017
comment
Я попробовал ваше предложение, но я все еще получаю тот же результат. - person OlavT; 05.01.2017

Я только что попытался воспроизвести - я думаю, что здесь скрывается какая-то странная ошибка. Я предполагаю, что на самом деле объект 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.

Я бы назвал это ошибкой.

person Anton Schwaighofer    schedule 20.01.2017