Ответ 1
Новый метод Dataset.from_generator()
позволяет определить Dataset
, который подается генератором Python. (Чтобы использовать эту функцию в настоящее время, вы должны загрузить ночную сборку TensorFlow или создать ее самостоятельно из источника. Она будет частью TensorFlow 1.4.)
Самый простой способ реализовать ваш пример - заменить ваш принимающий поток генератором с псевдокодом следующим образом:
def receiver():
while True:
next_element = ... # Receive next element from external source.
# Note that this method may block.
end_of_epoch = ... # Decide whether or not to stop based on next_element.
if not end_of_epoch:
yield next_element # Note: you may need to convert this to an array.
else:
return # Returning will signal OutOfRangeError on downstream iterators.
dataset = tf.contrib.data.Dataset.from_generator(receiver, output_types=...)
# You can chain other `Dataset` methods after the generator. For example:
dataset = dataset.prefetch(...) # This will start a background thread
# to prefetch elements from `receiver()`.
dataset = dataset.repeat(...) # Note that each repetition will call
# `receiver()` again, and start from
# a fresh state.
dataset = dataset.batch(...)
Возможны более сложные топологии. Например, вы можете использовать Dataset.interleave()
для создания нескольких приемников параллельно.