title: How to Properly Combine TensorFlow's Dataset API and Keras?
body: <p>Keras' <code>fit_generator()</code> model method expects a generator which produces tuples of the shape (input, targets), where both elements are NumPy arrays. <a href="https://keras.io/models/model/" rel="noreferrer">The documentation</a> seems to imply that if I simply wrap a <a href="https://www.tensorflow.org/programmers_guide/datasets" rel="noreferrer"><code>Dataset</code> iterator</a> in a generator, and make sure to convert the Tensors to NumPy arrays, I should be good to go. This code, however, gives me an error:</p>
  
  <pre><code>import numpy as np
  import os
  import keras.backend as K
  from keras.layers import Dense, Input
  from keras.models import Model
  import tensorflow as tf
  from tensorflow.contrib.data import Dataset
  
  os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
  
  with tf.Session() as sess:
      def create_data_generator():
          dat1 = np.arange(4).reshape(-1, 1)
          ds1 = Dataset.from_tensor_slices(dat1).repeat()
  
          dat2 = np.arange(5, 9).reshape(-1, 1)
          ds2 = Dataset.from_tensor_slices(dat2).repeat()
  
          ds = Dataset.zip((ds1, ds2)).batch(4)
          iterator = ds.make_one_shot_iterator()
          while True:
              next_val = iterator.get_next()
              yield sess.run(next_val)
  
  datagen = create_data_generator()
  
  input_vals = Input(shape=(1,))
  output = Dense(1, activation='relu')(input_vals)
  model = Model(inputs=input_vals, outputs=output)
  model.compile('rmsprop', 'mean_squared_error')
  model.fit_generator(datagen, steps_per_epoch=1, epochs=5,
                      verbose=2, max_queue_size=2)
  </code></pre>
  
  <p>Here's the error I get:</p>
  
  <pre><code>Using TensorFlow backend.
  Epoch 1/5
  Exception in thread Thread-1:
  Traceback (most recent call last):
    File "/home/jsaporta/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 270, in __init__
      fetch, allow_tensor=True, allow_operation=True))
    File "/home/jsaporta/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 2708, in as_graph_element
      return self._as_graph_element_locked(obj, allow_tensor, allow_operation)
    File "/home/jsaporta/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 2787, in _as_graph_element_locked
      raise ValueError("Tensor %s is not an element of this graph." % obj)
  ValueError: Tensor Tensor("IteratorGetNext:0", shape=(?, 1), dtype=int64) is not an element of this graph.
  
  During handling of the above exception, another exception occurred:
  
  Traceback (most recent call last):
    File "/home/jsaporta/anaconda3/lib/python3.6/threading.py", line 916, in _bootstrap_inner
      self.run()
    File "/home/jsaporta/anaconda3/lib/python3.6/threading.py", line 864, in run
      self._target(*self._args, **self._kwargs)
    File "/home/jsaporta/anaconda3/lib/python3.6/site-packages/keras/utils/data_utils.py", line 568, in data_generator_task
      generator_output = next(self._generator)
    File "./datagen_test.py", line 25, in create_data_generator
      yield sess.run(next_val)
    File "/home/jsaporta/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 895, in run
      run_metadata_ptr)
    File "/home/jsaporta/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1109, in _run
      self._graph, fetches, feed_dict_tensor, feed_handles=feed_handles)
    File "/home/jsaporta/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 413, in __init__
      self._fetch_mapper = _FetchMapper.for_fetch(fetches)
    File "/home/jsaporta/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 233, in for_fetch
      return _ListFetchMapper(fetch)
    File "/home/jsaporta/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 340, in __init__
      self._mappers = [_FetchMapper.for_fetch(fetch) for fetch in fetches]
    File "/home/jsaporta/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 340, in &lt;listcomp&gt;
      self._mappers = [_FetchMapper.for_fetch(fetch) for fetch in fetches]
    File "/home/jsaporta/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 241, in for_fetch
      return _ElementFetchMapper(fetches, contraction_fn)
    File "/home/jsaporta/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 277, in __init__
      'Tensor. (%s)' % (fetch, str(e)))
  ValueError: Fetch argument &lt;tf.Tensor 'IteratorGetNext:0' shape=(?, 1) dtype=int64&gt; cannot be interpreted as a Tensor. (Tensor Tensor("IteratorGetNext:0", shape=(?, 1), dtype=int64) is not an element of this graph.)
  
  Traceback (most recent call last):
    File "./datagen_test.py", line 34, in &lt;module&gt;
      verbose=2, max_queue_size=2)
    File "/home/jsaporta/anaconda3/lib/python3.6/site-packages/keras/legacy/interfaces.py", line 87, in wrapper
      return func(*args, **kwargs)
    File "/home/jsaporta/anaconda3/lib/python3.6/site-packages/keras/engine/training.py", line 2011, in fit_generator
      generator_output = next(output_generator)
  StopIteration
  </code></pre>
  
  <p>Strangely enough, adding a line containing <code>next(datagen)</code> directly after where I initialize <code>datagen</code> causes the code to run just fine, with no errors.</p>
  
  <p>Why does my original code not work? Why does it begin to work when I add that line to my code? Is there a more efficient way to use TensorFlow's Dataset API with Keras that doesn't involve converting Tensors to NumPy arrays and back again?</p>