title: How to use tf.Dataset design in both training and inferring?
body: <p>Say, we have input <code>x</code> and label <code>y</code>:</p>
  
  <pre><code>iterator = tf.data.Iterator.from_structure((x_type, y_type), (x_shape, y_shape))
  tf_x, tf_y = iterator.get_next()
  </code></pre>
  
  <p>Now I use generate function to create dataset:</p>
  
  <pre><code>def gen():
      for ....: yield (x, y)
  ds = tf.data.Dataset.from_generator(gen, (x_type, y_type), (x_shape, y_shape))
  </code></pre>
  
  <p>In my graph, I use <code>tf_x</code> and <code>tf_y</code> to do training, that is fine. But now I want to do referring, where I don't have label <code>y</code>. One workaround I made is to fake a y (like tf.zeros(y_shape)), then I use a placeholder to init the iterator.</p>
  
  <pre><code>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))})
  </code></pre>
  
  <p>My question is, is there a cleaner way to do that? without fake a <code>y</code> during inferring time?</p>
  
  <p>UPDATE:</p>
  
  <p>I experiment a little bit, looks like there is one dataset operation <code>unzip</code> missing:</p>
  
  <pre><code>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()
  </code></pre>