Я только что обновился до tenorflow 2.3. Я хочу сделать собственный генератор данных для обучения. С tenorflow 1.x я сделал следующее:
def get_data_generator(test_flag):
item_list = load_item_list(test_flag)
print('data loaded')
while True:
X = []
Y = []
for _ in range(BATCH_SIZE):
x, y = get_random_augmented_sample(item_list)
X.append(x)
Y.append(y)
yield np.asarray(X), np.asarray(Y)
data_generator_train = get_data_generator(False)
data_generator_test = get_data_generator(True)
model.fit_generator(data_generator_train, validation_data=data_generator_test,
epochs=10000, verbose=2,
use_multiprocessing=True,
workers=8,
validation_steps=100,
steps_per_epoch=500,
)
Этот код отлично работал с tensorflow 1.x. В системе создано 8 процессов. Процессор и видеокарта загрузились отлично. загруженные данные были напечатаны 8 раз.
С tenorflow 2.3 я получил предупреждение:
ПРЕДУПРЕЖДЕНИЕ: tensorflow: многопроцессорность может плохо взаимодействовать с TensorFlow, вызывая недетерминированные взаимоблокировки. Для высокопроизводительных конвейеров данных рекомендуется tf.data.
загруженные данные были напечатаны один раз (должно 8 раз). GPU загружен не полностью. У него также есть утечка памяти каждую эпоху, поэтому обучение будет остановлено через несколько эпох. Флаг use_multiprocessing не помог.
Как сделать генератор / итератор в тензорном потоке (keras) 2.x, который можно легко распараллелить между несколькими процессами ЦП? Тупики и порядок данных не важны.
tf.data
конвейера? Как сказано в предупреждении, это можно распараллелить. - person jakub   schedule 17.10.2020tf.data.Dataset.from_generator
? Вы, вероятно, сможете сделатьtf.data.Dataset
из существующего генератора. Я думаю, что генератор должен выдавать один образец на итерацию, а затем вы можете выполнить пакетную обработку с помощьюdataset.batch(BATCH_SIZE)
. - person jakub   schedule 19.10.2020