title: Saving predicted tensor to image in TensorFlow - Graph finalized
body: <p>I was able to train a model in TensorFlow with my own data. Input and Output of the model are images. I now tryed to get the output of the predictions and save it to an png image file to see whats going on. Unfortunately i am getting an error when running the following function i created to test with predictions. My goal is to save the prediction that is also an image so i can open it with a normal image viewer. </p>
  
  <p>Some more to the code. In my main i am creating an estimator</p>
  
  <pre><code>def predict_element(my_model, features):
    eval_input_fn = tf.estimator.inputs.numpy_input_fn(
      x=features,
      num_epochs=1,
      shuffle=False)
  
    eval_results = my_model.predict(input_fn=eval_input_fn)
  
    predictions = eval_results.next() #this returns a dict with my tensors
    prediction_tensor = predictions["y"] #get the tensor from the dict
  
    image_tensor = tf.reshape(prediction_tensor, [IMG_WIDTH, -1]) #reshape to a matrix due my returned tensor is a 1D flat one
    decoded_image = tf.image.encode_png(image_tensor)
    write_image = tf.write_file("output/my_output_image.png", decoded_image)
  
    with tf.Session() as sess:
      sess.run(tf.global_variables_initializer())
      print(sess.run(write_image))
  
  def get_input():
    filename_dataset = tf.data.Dataset.list_files("features/*.png")
    label_dataset = tf.data.Dataset.list_files("labels/*.png")
  
    # Make a Dataset of image tensors by reading and decoding the files.
    image_dataset = filename_dataset.map(lambda x: tf.cast(tf.image.decode_png(tf.read_file(x), channels=1),tf.float32))
    l_dataset = label_dataset.map(lambda x: tf.cast(tf.image.decode_png(tf.read_file(x),channels=1),tf.float32))
  
    image_reshape = image_dataset.map(lambda x: tf.reshape(x, [IM_WIDTH * IM_HEIGHT]))
    label_reshape = l_dataset.map(lambda x: tf.reshape(x, [IM_WIDTH * IM_HEIGHT]))
  
    iterator = image_reshape.make_one_shot_iterator()
    iterator2 = label_reshape.make_one_shot_iterator()
  
    next_img = iterator.get_next()
    next_lbl = iterator2.get_next()
  
    features = []
    labels = []
    # read all 10 images and labels and put it in the array
    # so we can pass it to the estimator
    with tf.Session() as sess:
      sess.run(tf.global_variables_initializer())
      for i in range(10):
        t1, t2 = sess.run([next_img, next_lbl])
        features.append(t1)
        labels.append(t2)
  
    return {"x": np.array(features)}, np.array(labels)
  
  def main(unused_argv):
      features, labels = get_input() # creating the features dict {"x": }
      my_estimator = tf.estimator.Estimator(model_fn=my_cnn_model, model_dir="/tmp/my_model")
  
      predict_element(my_estimator, features)
  </code></pre>
  
  <p>The error is </p>
  
  <blockquote>
    <p>Graph is finalized and cannot be modified</p>
  </blockquote>
  
  <p>With some easy print() statements i could see that retrieving the dict with</p>
  
  <blockquote>
    <p>eval_results = my_model.predict(input_fn=eval_input_fn)</p>
  </blockquote>
  
  <p>is probable the one wich finalizes the graph. 
  I absolutely don't know what to do or where to look for a solution here. How could i save the output?</p>
  
  <p>I tried this in my model_fn:</p>
  
  <pre><code>#the last layer of my network is dropout
  predictions = {
     "y": dropout
      }
  
    if mode == tf.estimator.ModeKeys.PREDICT:
      reshape1 = tf.reshape(dropout, [-1,IM_WIDTH, IM_HEIGHT])
      sliced = tf.slice(reshape1, [0,0,0], [1, IM_WIDTH, IM_HEIGHT])
      encoded = tf.image.encode_png(tf.cast(sliced, dtype=tf.uint8))
      outputfile = tf.write_file(params["output_path"], encoded)
      return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)
  </code></pre>
  
  <p>My problem here is that i can't pass back the "outputfile" node so i can work with it. </p>