Выборка из набора данных тензорного потока в один и тот же тензор несколько раз за один вызов session.run () - PullRequest
1 голос
/ 05 июня 2019

Рассмотрим следующий пример:

import tensorflow as tf
import numpy as np

X = np.arange(4).reshape(4, 1) + (np.arange(3) / 10).reshape(1, 3)

batch = tf.data.Dataset.from_tensor_slices(X) \
        .batch(2).make_one_shot_iterator().get_next()

def foo(x):
    return x + 1

tensor = foo(batch)

Теперь я ищу способ, с помощью которого можно сэмплировать tensor несколько раз за один session.run() вызов, т. Е .:

def bar(x):
    return x - 1

result1 = bar(tensor)
with tf.control_dependencies([result1]):
    op = <create operation to sample from dataset into `tensor` again>
    with tf.control_dependencies([op]):
        result2 = bar(tensor)

sess = tf.Session()
print(*sess.run([result1, result2]), sep='\n\n')

который должен вывести:

[[0.  0.1 0.2]
 [1.  1.1 1.2]]

[[2.  2.1 2.2]
 [3.  3.1 3.2]]

Это вообще возможно? Я знаю, что можно вызвать get_next() несколько раз, чтобы получить несколько выборок набора данных в различных тензорных объектах, но можно ли сделать один выборку в один и тот же тензорный объект?

Для меня сценарий использования таков, что части этого кода foo и bar разделены, а часть foo не знает, сколько раз потребуется сэмплов за цикл.

P.S. Я использую тф 1.12. 1.13 тоже вариант, но не тф 2, хотя.

1 Ответ

0 голосов
/ 05 июня 2019

Да, это возможно.

Несколько идей о том, что вы уже пробовали:

  1. Вы можете использовать итератор набора данных, возвращаемый из make_one_shot_iterator() каждый раз, когда вам нужно новое значение из набора данных
  2. Вы можете создать свою собственную функцию, которая является частью графика, чтобы передать результат через foo()

Нечто подобное дает желаемый результат (насколько я понимаю)

import tensorflow as tf
import numpy as np

X = np.arange(4).reshape(4, 1) + (np.arange(3) / 10).reshape(1, 3)

iterator = tf.data.Dataset.from_tensor_slices(X) \
        .batch(2).make_one_shot_iterator()

def foo(x):
    return x + 1

def get_tensor():
  return foo(iterator.get_next())

tensor = get_tensor()

def bar(x):
    return x - 1

result1 = bar(tensor)
with tf.control_dependencies([result1]):
    op = get_tensor()
    with tf.control_dependencies([op]):
        result2 = bar(op)

sess = tf.Session()
print(*sess.run([result1, result2]), sep='\n\n')
...