Наиболее эффективный подход, почти всегда, является продуктом итеративного улучшения. Итак, как хорошее начало, давайте рассмотрим пример. В целях демонстрации я использовал игрушечный массив со случайными цветными блоками, разделил его на 13 полос и сцепил всего 3. Первое измерение добавлено для batch_size
init_image = np.random.randint(0,255,(1, 4, 4, 13))
bands = np.split(d, 13, axis=3)
image = np.concatenate((d_s[0], d_s[1], d_s[2]), axis=3)
Сначала мы создаем одно большое изображение из набора данных, чтобы извлечь из него патчи.
dataset = tf.data.Dataset.from_tensor_slices(image)
dataset = dataset.batch(1)
#This, if evaluated inside session, outputs array of shape (1, 4, 4, 3)
Затем мы применяем функцию карты для извлечения патчей. Это делается с помощью tf.image.extract_image_patches , параметры ksizes, шагов и скоростей определяют геометрические свойства патча. Вы можете найти отличное объяснение здесь . В этом случае мы возьмем патчи размером 2х2, непосредственно прилегающие друг к другу. Всего 4 патча. extract_image_patches
поместит все патчи в последнее измерение, o reshape
применяется, чтобы получить желаемый результат 4 патчей из 3-х каналов изображения формы 2x2.
def parse_func(image):
ksizes = [1, 2, 2, 1]
strides = [1, 2, 2, 1]
rates = [1, 1, 1, 1]
patches = tf.image.extract_image_patches(image, ksizes, strides, rates, 'SAME')
image_tensor = tf.reshape(patches, [-1, 2, 2, 3])
return image_tensor
Затем мы применяем эту функцию к набору данных, затем распаковываем вывод, чтобы перемешать его и создать новый пакет из исправлений. В этом случае размер пакета и размер буфера перемешивания равны количеству исправлений.
dataset = dataset.map(pf)
dataset = dataset.apply(tf.data.experimental.unbatch())
dataset = dataset.shuffle(4).batch(4)
Будет выведен пакет формы (4, 2, 2, 3)
. Как видите, вывод состоит из 4 патчей формы (2, 2, 3). Если shuffle не применяется, то порядок будет в порядке от левого верхнего угла до правого нижнего.
Кроме того, взгляните на официальный конвейер ввода Руководство по производительности