CNTK: создание MinibatchSource из массива numpy для обучения нескольких графических процессоров

У меня есть предварительно обработанные данные изображений в массиве numpy, и мой скрипт отлично работает с одним графическим процессором, подавая массив numpy. Из того, что я понял, нам нужно создать MinibatchSource для обучения нескольких GPU. Я проверяю этот пример ( ConvNet_CIFAR10_DataAug_Distributed.py) для распределенного обучения, однако он использует *_map.txt который в основном представляет собой список путей к файлу изображения (например, PNG). Мне интересно, как лучше всего создать MinibatchSource из массива numpy вместо преобразования массива numpy обратно в png-файлы.

1 ответ

Вы можете создавать составные программы чтения, которые объединяют несколько десериализаторов изображений в один источник. Сначала вам нужно создать два файла карты (с фиктивными метками). Один будет содержать все входные изображения, а другой будет содержать соответствующие целевые изображения. Следующий код является минимальной реализацией, при условии, что файлы называются map1.txt а также map2.txt

import numpy as np
import cntk as C
import cntk.io.transforms as xforms 
import sys

def create_reader(map_file1, map_file2):
    transforms = [xforms.scale(width=224, height=224, channels=3, interpolations='linear')]
    source1 = C.io.ImageDeserializer(map_file1, C.io.StreamDefs(
        source_image = C.io.StreamDef(field='image', transforms=transforms)))
    source2 = C.io.ImageDeserializer(map_file2, C.io.StreamDefs(
        target_image = C.io.StreamDef(field='image', transforms=transforms)))
    return C.io.MinibatchSource([source1, source2], max_samples=sys.maxsize, randomize=True)

x = C.input_variable((3,224,224))
y = C.input_variable((3,224,224))
# world's simplest model
model = C.layers.Convolution((3,3),3, pad=True)
z = model(x)
loss = C.squared_error(z, y)

reader = create_reader("map1.txt", "map2.txt")
trainer = C.Trainer(z, loss, C.sgd(z.parameters, C.learning_rate_schedule(.00001, C.UnitType.minibatch)))

minibatch_size = 2

input_map={
    x: reader.streams.source_image,
    y: reader.streams.target_image
}

for i in range(30):
    data=reader.next_minibatch(minibatch_size, input_map=input_map)
    print(data)
    trainer.train_minibatch(data)
Другие вопросы по тегам