CNTK:从用于多 GPU 训练的 numpy 数组创建 MinibatchSource
CNTK: Create MinibatchSource from numpy array for multi GPU training
我在 numpy 数组中有我的预处理图像数据,我的脚本在 feeding numpy array. From what I understood, we need to create MinibatchSource for multiple GPU training. I'm checking this example (ConvNet_CIFAR10_DataAug_Distributed.py) 的单个 GPU 上工作良好)用于分布式训练,但是它使用 *_map.txt
,这基本上是一个列表图像文件的路径(例如 png)。我想知道最好的方法是从 numpy 数组创建 MinibatchSource,而不是将 numpy 数组转换回 png 文件。
您可以创建复合读取器,将多个图像反序列化器组合到一个源中。首先,您需要创建两个地图文件(带有虚拟标签)。一个将包含所有输入图像,另一个将包含相应的目标图像。下面的代码是一个最小的实现,假设文件被称为 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)
我在 numpy 数组中有我的预处理图像数据,我的脚本在 feeding numpy array. From what I understood, we need to create MinibatchSource for multiple GPU training. I'm checking this example (ConvNet_CIFAR10_DataAug_Distributed.py) 的单个 GPU 上工作良好)用于分布式训练,但是它使用 *_map.txt
,这基本上是一个列表图像文件的路径(例如 png)。我想知道最好的方法是从 numpy 数组创建 MinibatchSource,而不是将 numpy 数组转换回 png 文件。
您可以创建复合读取器,将多个图像反序列化器组合到一个源中。首先,您需要创建两个地图文件(带有虚拟标签)。一个将包含所有输入图像,另一个将包含相应的目标图像。下面的代码是一个最小的实现,假设文件被称为 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)