2017-05-14 4 views
5

ich tf.estimator.Estimator bin mit einem Modell zu trainieren:Vorhersage von Modell mit `tf.estimator.Estimator` in Tensorflow gespeichert

def model_fn(features, labels, mode, params, config): 

    input_image = features["input_image"] 

    eval_metric_ops = {} 
    predictions = {} 

    # Create model 
    with tf.name_scope('Model'): 

     W = tf.Variable(tf.zeros([784, 10]), name="W") 
     b = tf.Variable(tf.zeros([10]), name="b") 
     logits = tf.nn.softmax(tf.matmul(input_image, W, name="MATMUL") + b, name="logits") 

    loss = None 
    train_op = None 

    if mode != tf.estimator.ModeKeys.PREDICT: 
     loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)) 
     train_op = tf.contrib.layers.optimize_loss(loss=loss, 
                 global_step=tf.contrib.framework.get_global_step(), 
                 learning_rate=params["learning_rate"], 
                 optimizer=params["optimizer"]) 
    # Add prediction 
    classes = tf.as_string(tf.argmax(input=logits, axis=1, name="class")) 
    with tf.name_scope('Predictions'): 
     predictions["logits"] = logits 
     predictions["classes"] = classes 

    export_outputs = {"classes": tf.estimator.export.ClassificationOutput(classes=classes)} 
    export_outputs = {"classes": tf.estimator.export.PredictOutput({"labels": classes})} 

    spec = tf.estimator.EstimatorSpec(mode=mode, 
             predictions=predictions, 
             loss=loss, 
             train_op=train_op, 
             eval_metric_ops=eval_metric_ops, 
             export_outputs=export_outputs, 
             training_chief_hooks=None, 
             training_hooks=None, 
             scaffold=None) 
    return spec 

def input_fn(dataset, n=10): 

    return dataset.images[:n], dataset.labels[:n] 


model_params = {"learning_rate": 1e-3, 
       "optimizer": "Adam"} 

#run_path = os.path.join(runs_path, datetime.now().strftime("%Y-%m-%d-%H-%M-%S")) 
run_path = os.path.join(runs_path, "run1") 
if os.path.exists(run_path): 
    shutil.rmtree(run_path) 

estimator = tf.estimator.Estimator(model_fn=model_fn, model_dir=run_path, params=model_params) 


# Train 
inputs = lambda: input_fn(mnist.train, n=15) 
estimator.train(input_fn=inputs, steps=1000) 

Modell und Gewichte richtig während des Trainings gespeichert.

Jetzt möchte ich das Modell + Gewichte in einem anderen Skript neu laden, um Vorhersagen zu treffen.

Aber ich weiß nicht, wie man den Eingang spezifiziert, weil ich keinen Bezug dazu in der model_fn Funktion habe.

# Get some data to predict 
input_data = mnist.test.images[:5] 

tf.reset_default_graph() 
run_path = os.path.join(runs_path, "run1") 

# Load the model (graph) 
input_checkpoint = os.path.join(run_path, "model.ckpt-1000") 
saver = tf.train.import_meta_graph(input_checkpoint + '.meta', clear_devices=True) 

# Restore the weights 
sess = tf.InteractiveSession() 
saver.restore(sess, input_checkpoint) 
graph = sess.graph 

# Get the op to compute for prediction 
predict_op = graph.get_operation_by_name("Predictions/class") 

# predictions = sess.run(predict_op, feed_dict=????) 

Hier ist, was graph.get_collection("variables") zurück:

[<tf.Variable 'global_step:0' shape=() dtype=int64_ref>, 
<tf.Variable 'Model/W:0' shape=(784, 10) dtype=float32_ref>, 
<tf.Variable 'Model/b:0' shape=(10,) dtype=float32_ref>, 
<tf.Variable 'OptimizeLoss/learning_rate:0' shape=() dtype=float32_ref>, 
<tf.Variable 'OptimizeLoss/beta1_power:0' shape=() dtype=float32_ref>, 
<tf.Variable 'OptimizeLoss/beta2_power:0' shape=() dtype=float32_ref>, 
<tf.Variable 'OptimizeLoss/Model/W/Adam:0' shape=(784, 10) dtype=float32_ref>, 
<tf.Variable 'OptimizeLoss/Model/W/Adam_1:0' shape=(784, 10) dtype=float32_ref>, 
<tf.Variable 'OptimizeLoss/Model/b/Adam:0' shape=(10,) dtype=float32_ref>, 
<tf.Variable 'OptimizeLoss/Model/b/Adam_1:0' shape=(10,) dtype=float32_ref>] 

Habe ich eine tf.placeholder für die Eingabe angeben müssen? Aber dann, wie Tensorflow die Eingabe kennt, sollte diesen spezifischen Platzhalter füttern?

Auch wenn ich etwas wie features = tf.constant(features, name="input") am Anfang des Modells angeben, kann ich es nicht verwenden, weil es kein Tensor ist, sondern eine Operation.


EDIT

Nach mehr Untersuchung habe ich festgestellt, dass ich mein Modell mit der Estimator.export_savedmodel() Methode (und nicht wieder mit den automatisch gespeichert Checkpoints während des Trainings mit dem Schätzer speichern.

feature_spec = {"input_image": tf.placeholder(dtype=tf.float32, shape=[None, 784])} 

input_receiver_fn = tf.estimator.export.build_raw_serving_input_receiver_fn(feature_spec) 
estimator.export_savedmodel(model_path, input_receiver_fn, as_text=True) 

Dann habe ich versucht, das Modell zu laden und Vorhersage zu tun, aber ich weiß nicht, wie das Modell mit meinen numpy Bildern zu füttern:

preds = sess.run("class", feed_dict={"input_image": input_data}) 

Und der vorbehalten Fehler:

/home/hadim/local/conda/envs/ws/lib/python3.6/site-packages/tensorflow/python/client/session.py in run(self, fetches, feed_dict, options, run_metadata) 
    776  try: 
    777  result = self._run(None, fetches, feed_dict, options_ptr, 
--> 778       run_metadata_ptr) 
    779  if run_metadata: 
    780   proto_data = tf_session.TF_GetBuffer(run_metadata_ptr) 

/home/hadim/local/conda/envs/ws/lib/python3.6/site-packages/tensorflow/python/client/session.py in _run(self, handle, fetches, feed_dict, options, run_metadata) 
    931   except Exception as e: 
    932    raise TypeError('Cannot interpret feed_dict key as Tensor: ' 
--> 933        + e.args[0]) 
    934 
    935   if isinstance(subfeed_val, ops.Tensor): 

TypeError: Cannot interpret feed_dict key as Tensor: The name 'input_image' looks like an (invalid) Operation name, not a Tensor. Tensor names must be of the form "<op_name>:<output_index>". 
+0

[Beispiel der Funktion export_savedmodel] (https://stackoverflow.com/a/48329456/4268517) –

Antwort

1

Der Name Ihres Eingangs Tensor wahrscheinlich ist input_image:0.

Sie können die Signatur Ihrer gespeicherten Modells Liste durch den Aufruf:

print(estimator.signature_def[tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY])

, dass die erwartete Eingabe/Ausgabe-Tensoren Liste sollte.

+0

'input_image: 0' funktioniert nicht und' 'Estimator' hat kein Attribut 'signature_def''. Ich benutze TF 1.1.0. – HadiM

-1

Ich arbeite mit tf.contrib.learn.Estimator. Wie ich sehe, sind die Syntax und die Methodensignaturen fast gleich, so dass die Unterschiede mit den verschiedenen Tensorflow-Versionen zusammenhängen. So kann man mit so etwas wie

estimator = learn.Estimator(
     model_fn=your_model, 
     model_dir="tmp", 
     config=tf.contrib.learn.RunConfig(
      save_checkpoints_steps=10, 
      save_summary_steps=10, 
      save_checkpoints_secs=None 
     ) 
    ) 

Dann Estimator wie gewohnt erstellen Sie mit dem Zug als estimator.fit(input_fn=input_function, steps=100)

tun Und dann können Sie die Vorhersage tun

estimator .predict(prediction) 

Mote, es ruft ein Trick, bezogen auf die Tensorflow known issue.predict Aufruf initialisiert werden nicht mehr richtig Estimator, so müssen Sie vor dem Aufruf predict

estimator.evaluate(x=prediction, y=label_array, steps=1) 

nennen.

Hoffe, das hilft.

+3

Meine Frage bestand darin, Vorhersagen von einem zuvor gespeicherten Modell auf einer Festplatte zu treffen. – HadiM

+0

Wenn Sie einen Schätzer erstellen, der "model_dir" bereitstellt, wird Ihr trainiertes Modell von der Festplatte geladen (das Verzeichnis, das in diesem Parameter angegeben ist). So können Sie die Vorhersage dann machen. –

+0

Entschuldigung dafür, dass ich nicht klar bin, aber meine Idee war, "jedes" Modell von der Festplatte zu laden, ohne den Quellcode 'model_fn' zu haben. So scheint es nicht möglich zu sein. – HadiM

0

Wie für den TypeError, löse ich es auf diese Weise.

Zuerst Namen der Platzhalter:

feature_spec = {"input_image": tf.placeholder(dtype=tf.float32, shape=[None, 784], name='input_image')} 

Dann können Sie es wie folgt verwenden:

feed_dict={"input_image:0": input_data} 

Hoffe es kann jemand helfen.

Verwandte Themen