title: Keras model.fit() with tf.dataset API + validation_data
body: <p>So I have got my keras model to work with a tf.Dataset through the following code:</p>
  
  <pre><code># Initialize batch generators(returns tf.Dataset)
  batch_train = build_features.get_train_batches(batch_size=batch_size)
  
  # Create TensorFlow Iterator object
  iterator = batch_train.make_one_shot_iterator()
  dataset_inputs, dataset_labels = iterator.get_next()
  
  # Create Model
  logits = .....(some layers)
  keras.models.Model(inputs=dataset_inputs, outputs=logits)
  
  # Train network
  model.compile(optimizer=train_opt, loss=model_loss, target_tensors=[dataset_labels])
  model.fit(epochs=epochs, steps_per_epoch=num_batches, callbacks=callbacks, verbose=1)
  </code></pre>
  
  <p>however when I try to pass <code>validation_data</code> parameter to the model. fit it tells me that I cannot use it with the generator. Is there a way to use validation while using tf.Dataset</p>
  
  <p><strong>for example in tensorflow I could do the following</strong>:</p>
  
  <pre><code># initialize batch generators
  batch_train = build_features.get_train_batches(batch_size=batch_size)
  batch_valid = build_features.get_valid_batches(batch_size=batch_size)
  
  # create TensorFlow Iterator object
  iterator = tf.data.Iterator.from_structure(batch_train.output_types,
                                             batch_train.output_shapes)
  
  # create two initialization ops to switch between the datasets
  init_op_train = iterator.make_initializer(batch_train)
  init_op_valid = iterator.make_initializer(batch_valid)
  </code></pre>
  
  <p>then just use <code>sess.run(init_op_train)</code> and <code>sess.run(init_op_valid)</code> to switch between the datasets</p>
  
  <p>I tried implementing a callback that does just that (switch to validation set, predict and back) but it tells me I can't use model.predict in a callback</p>
  
  <p>can someone help me get validation working with Keras+Tf.Dataset</p>
  
  <h2>edit: incorporate answer into the code</h2>
  
  <p><strong>so FINALLY what worked for me, thanks to the selected answer is:</strong></p>
  
  <pre><code># Initialize batch generators(returns tf.Dataset)
  batch_train = # returns tf.Dataset
  batch_valid = # returns tf.Dataset
  
  # Create TensorFlow Iterator object and wrap it in a generator
  itr_train = make_iterator(batch_train)
  itr_valid = make_iterator(batch_train)
  
  # Create Model
  logits = # the keras model
  keras.models.Model(inputs=dataset_inputs, outputs=logits)
  
  # Train network
  model.compile(optimizer=train_opt, loss=model_loss, target_tensors=[dataset_labels])
  model.fit_generator(
      generator=itr_train, validation_data=itr_valid, validation_steps=batch_size,
      epochs=epochs, steps_per_epoch=num_batches, callbacks=cbs, verbose=1, workers=0)
  
  def make_iterator(dataset):
      iterator = dataset.make_one_shot_iterator()
      next_val = iterator.get_next()
  
      with K.get_session().as_default() as sess:
          while True:
              *inputs, labels = sess.run(next_val)
              yield inputs, labels
  </code></pre>
  
  <p>This doesn't introduce any <strong>overhead</strong></p>