Tensorflow 2.0: лучший способ структурировать вывод `tf.data.Dataset` в сценарии с несколькими входами - PullRequest
0 голосов
/ 01 апреля 2020

Я строю GAN на Tensorflow для удаления изображений, это реализация DeblurGANv2. Я настроил GAN таким образом, чтобы он имел два входа, пакет размытых изображений и пакет четких изображений. Следуя этим строкам, я создаю ввод в виде словаря Python с двумя ключами ['sharp', 'blur'], каждый из которых имеет тензор формы [batch_size, 512, 512, 3], это облегчает подачу пакета размытых изображений в генератор, а затем передает выходные данные генератора и резких изображений в пакетном режиме для дискриминатора.

Основываясь на последних требованиях, я создаю tf.data.Dataset, который выводит именно это, dict, содержащий два тензора, каждый из которых имеет свой размер пакета. это прекрасно дополняет мою реализацию GAN, все работает нормально и гладко.

Так что имейте в виду, мой ввод не тензор, а диктат python, который не имеет пакетного измерения, это будет актуально для объясню мою проблему позже.

Недавно я решил добавить поддержку распределенного обучения с использованием стратегий распределения Tensorflow. Эта функция Tensorflow позволяет распределять обучение по нескольким устройствам, в том числе по нескольким машинам. В некоторых реализациях есть функция, например MirroredStrategy, которая принимает входной тензор, разбивает его на равные части и передает каждый срез на разные устройства, что означает, что если у вас размер пакета 16 и 4 графических процессора каждый графический процессор прекратит принимать локальную партию из 4 точек данных, после чего есть некоторые магические значения c для агрегирования результатов и другие вещи, не относящиеся к моей проблеме.

Как вы уже заметили, критически важно для стратегий распределения иметь тензор в качестве входных данных или, по крайней мере, какой-то тип входных данных с внешним размером пакета, и то, что у меня есть, - Python dict, с размером пакета входных данных во внутренних значениях тензора словаря. Это огромная проблема, моя текущая реализация не совместима с распределенным обучением.

Я искал обходные пути, но я не могу очень хорошо обдумать это, возможно, просто сделаю входной сигнал огромным тензором shape=[batch_size, 2, 512, 512, 3] и нарезать это? не уверен, что это просто пришло мне в голову прямо сейчас LOL. В любом случае, я вижу это очень неоднозначно, я не могу отличить два входа, по крайней мере, с ясностью ключей словаря. Редактировать: проблема с этим решением состоит в том, что делает мои преобразования набора данных очень дорогими, следовательно, делает пропускную способность набора данных намного медленнее, учитывая, что это конвейер загрузки изображений, это важный момент.

Может быть, мое объяснение как работают распределенные стратегии, не самая строгая, если я не вижу, что-то, не стесняйтесь исправлять меня, пожалуйста.

PD: Это не вопрос об ошибке или не ошибка кода, в основном, «Запрос проектирования системы», надеюсь, что это не незаконно здесь

1 Ответ

1 голос
/ 08 апреля 2020

Вместо использования словаря в качестве входных данных GAN, вы можете попытаться отобразить функцию следующим образом:

def load_image(fileA,fileB):
    imageA = tf.io.read_file(fileA)
    imageA = tf.image.decode_jpeg(imageA, channels=3)

    imageB = tf.io.read_file(fileB)
    imageB = tf.image.decode_jpeg(imageB)
    return imageA,imageB

trainA = glob.glob('blur/*.jpg')
trainB = glob.glob('sharp/*.jpg')
train_dataset = tf.data.Dataset.from_tensor_slices((trainA,trainB))
train_dataset = train_dataset.map(load_image).batch(batch_size)

#for mirrored strategy

dist_dataset = mirrored_strategy.experimental_distribute_dataset(train_dataset)

Вы можете выполнить итерацию набора данных и обновить сеть, передав оба изображения.
Надеюсь, это поможет!

...