Как использовать дизайн tf.Dataset как для обучения, так и для вывода?

Скажем, у нас есть ввод x и метка y:

iterator = tf.data.Iterator.from_structure((x_type, y_type), (x_shape, y_shape))
tf_x, tf_y = iterator.get_next()

Теперь я использую функцию генерации для создания набора данных:

def gen():
    for ....: yield (x, y)
ds = tf.data.Dataset.from_generator(gen, (x_type, y_type), (x_shape, y_shape))

На моем графике я использую tf_x и tf_y для обучения, это нормально. Но теперь я хочу сделать ссылку, где у меня нет метки y. Один обходной путь, который я сделал, - это подделать y (например, tf.zeros(y_shape)), затем я использую заполнитель для инициализации итератора.

x_placeholder = tf.placeholder(...)
y_placeholder = tf.placeholder(...)
ds = tf.data.Dataset.from_tensors((x_placeholder, y_placeholder))
ds_init_op = iterator.make_initializer(ds)
sess.run(ds_init_op, feed_dict={x_placeholder=x, y_placeholder=fake(y))})

Мой вопрос в том, есть ли более чистый способ сделать это? без подделки y во время вывода?

ОБНОВИТЬ:

Я немного поэкспериментировал, похоже, отсутствует одна операция с набором данных unzip:

import numpy as np
import tensorflow as tf


x_type = tf.float32
y_type = tf.float32
x_shape = tf.TensorShape([None, 128])
y_shape = tf.TensorShape([None, 10])
x_shape_nobatch = tf.TensorShape([128])
y_shape_nobatch = tf.TensorShape([10])

iterator_x = tf.data.Iterator.from_structure((x_type,), (x_shape,))
iterator_y = tf.data.Iterator.from_structure((y_type,), (y_shape,))


def gen1():
    for i in range(100):
        yield np.random.randn(128)
ds1 = tf.data.Dataset.from_generator(gen1, (x_type,), (x_shape_nobatch,))
ds1 = ds1.batch(5)
ds1_init_op = iterator_x.make_initializer(ds1)


def gen2():
    for i in range(80):
        yield np.random.randn(128), np.random.randn(10)
ds2 = tf.data.Dataset.from_generator(gen2, (x_type, y_type), (x_shape_nobatch, y_shape_nobatch))
ds2 = ds2.batch(10)

# my ds2 has two tensors in one element, now the problem is
# how can I unzip this dataset so that I can apply them to iterator_x and iterator_y?
# such as:
ds2_x, ds2_y = tf.data.Dataset.unzip(ds2)  #?? missing this unzip operation!
ds2_x_init_op = iterator_x.make_initializer(ds2_x)
ds2_y_init_op = iterator_y.make_initializer(ds2_y)


tf_x = iterator_x.get_next()
tf_y = iterator_y.get_next()

person Xiang Zhang    schedule 02.03.2018    source источник


Ответы (1)


Цель API наборов данных — избежать передачи значений непосредственно в сеанс (поскольку это приводит к тому, что данные сначала передаются клиенту, а затем — устройству).

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

def train_dataset(data_dir):
  """Returns a tf.data.Dataset yielding (image, label) pairs for training."""
  data = input_data.read_data_sets(data_dir, one_hot=True).train
  return tf.data.Dataset.from_tensor_slices((data.images, data.labels))

def infer_dataset(data_dir):
  """Returns a tf.data.Dataset yielding images for inference."""
  data = input_data.read_data_sets(data_dir, one_hot=True).test
  return tf.data.Dataset.from_tensors((data.images,))

...

def train_input_fn():
  dataset = train_dataset(FLAGS.data_dir)
  dataset = dataset.shuffle(buffer_size=50000).batch(1024).repeat(10)
  (images, labels) = dataset.make_one_shot_iterator().get_next()
  return (images, labels)

mnist_classifier.train(input_fn=train_input_fn)

...

def infer_input_fn():
  return infer_dataset(FLAGS.data_dir).make_one_shot_iterator().get_next()

mnist_classifier.predict(input_fn=infer_input_fn)
person Maxim    schedule 02.03.2018
comment
спасибо, но в моей ситуации мне нужно настроить службу, чтобы получить ввод и предсказать результат. Кроме того, некоторый результат будет введен для следующего ввода прогноза: x_t_2 = predict(x_t_1) + states_t_2. Я также обновил свой вопрос, там я попробовал некоторые эксперименты, похоже, мне нужна операция Dataset.unzip. - person Xiang Zhang; 02.03.2018
comment
Если вы хотите использовать сеанс напрямую, я думаю, вы правы, unzip позволит вам инициализировать только x итератор - person Maxim; 02.03.2018