title: In the estimator of Tensorflow, how does it work when model_fn is called multiple times?
body: <pre><code>def model_fn(features, labels, mode, params):
    """Model function for Estimator."""
  
    # Connect the first hidden layer to input layer
    # (features["x"]) with relu activation
    first_hidden_layer = tf.layers.dense(features["x"], 10, activation=tf.nn.relu)
  
    # Connect the second hidden layer to first hidden layer with relu
    second_hidden_layer = tf.layers.dense(
        first_hidden_layer, 10, activation=tf.nn.relu)
  
    # Connect the output layer to second hidden layer (no activation fn)
    output_layer = tf.layers.dense(second_hidden_layer, 1)
  
    # Reshape output layer to 1-dim Tensor to return predictions
    predictions = tf.reshape(output_layer, [-1])
  
    # Provide an estimator spec for `ModeKeys.PREDICT`.
    if mode == tf.estimator.ModeKeys.PREDICT:
      return tf.estimator.EstimatorSpec(
          mode=mode,
          predictions={"ages": predictions})
  
    # Calculate loss using mean squared error
    loss = tf.losses.mean_squared_error(labels, predictions)
  
    # Calculate root mean squared error as additional eval metric
    eval_metric_ops = {
        "rmse": tf.metrics.root_mean_squared_error(
            tf.cast(labels, tf.float64), predictions)
    }
  
    optimizer = tf.train.GradientDescentOptimizer(
        learning_rate=params["learning_rate"])
    train_op = optimizer.minimize(
        loss=loss, global_step=tf.train.get_global_step())
  
    # Provide an estimator spec for `ModeKeys.EVAL` and `ModeKeys.TRAIN` modes.
    return tf.estimator.EstimatorSpec(
        mode=mode,
        loss=loss,
        train_op=train_op,
        eval_metric_ops=eval_metric_ops)
  </code></pre>
  
  <p>Above is an example of the model_fn used by Tensorflow's <a href="https://www.tensorflow.org/extend/estimators" rel="nofollow noreferrer">Estimator</a>.</p>
  
  <p>As mentioned in the tutorial, this model_fn could be called in different context (train, predict, evaluate). However, I'm a bit confused, because each time the model_fn is called, <strong>instead of reusing existing graph, it seems to create a new graph (or create new node in the graph)</strong></p>
  
  <p>For example, firstly I called model_fn under TRAIN mode, then I called model_fn with PREDICT mode. How can I make sure the PREDICT one is reusing the weight of the trained values?</p>