0

Der Versuch, die gcloud ML Motor mit dem folgenden Code einzurichten:gcloud ML-Engine fügt zusätzliche Dimension Eingangsarray

import numpy as np 
import tensorflow as tf 

x = tf.placeholder('float', shape=[None, 3], name='x') 
w = tf.Variable(tf.zeros([3, 2])) 
y = tf.nn.softmax(tf.matmul(x, w), name='y') 

sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 

tensor_info_x = tf.saved_model.utils.build_tensor_info(x) 
tensor_info_y = tf.saved_model.utils.build_tensor_info(y) 

prediction_signature = (
    tf.saved_model.signature_def_utils.build_signature_def(
     inputs={'inputs': tensor_info_x}, 
     outputs={'scores': tensor_info_y}, 
     method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME) 
    ) 

export_path = './test_exports' 
builder = tf.saved_model.builder.SavedModelBuilder(export_path) 
legacy_init_op = tf.group(tf.tables_initializer(), name='legacy_init_op') 
builder.add_meta_graph_and_variables(
     sess, [tf.saved_model.tag_constants.SERVING], 
     signature_def_map={ 
      'predict_images': 
       prediction_signature 
     }, 
     legacy_init_op=legacy_init_op) 
builder.save() 

A Abtastwerteingang JSON Datei-I für die Vorhersage verwendet wird, ist:

{ "inputs" : [[ 0.32439028, 0.07830289, 0.30881251], [ 0.32439028, 0.07830289, 0.30881251]] } 

Wie Sie sehen können, ist die Form des Eingabe-Arrays (2, 3). Wenn jedoch diese als Eingabe für das Modell Fütterung, ich bin vor einem Fehler:

Cannot feed value of shape (1, 2, 3) for Tensor u'x:0', which has shape '(?, 3)' (Error code: 2)

dies weiter zu testen, auf eine Eingabe von Größe zu geben (1, 3), das Modell perfekt funktioniert. Irgendeine Idee, wie die zusätzliche Dimension hinzugefügt wird?

EDIT:

Befehl zum Test verwendet:

Antwort

0

ML Motor für eine Charge von Eingängen prognostiziert, nicht nur eine. So sollten Sie Ihre Portion Eingangs Platzhalter ändern [Keine, 2, 3]

übrigens für die Ausbildung Ihr Modell Prozess als auch besser wäre, einen Ansatz mit.

+0

Dank für die Antwort! Ich bin ein bisschen verwirrt. Meine Eingaben sollten eindimensionale Arrays der Länge 3 sein. Um es also als Stapel zu machen, gab ich die Größe von x als [None, 3] an. Der Prozess führt eine Matrixmultiplikation von [N, 3] Eingabe- und [3, w] Gewichtsmatrizen durch, wobei N die Anzahl der Eingaben im Stapel darstellt. Ich kann Xs Form nicht zu [None, 2,3] ändern, da die Größe 2 nicht festgelegt ist. Irgendeine Idee, wie man das umgehen kann? –

+1

Aah. Platzieren Sie in Ihrer JSON-Datei verschiedene Instanzen in verschiedenen Zeilen. Ihre Eingaben müssen ein 1D-Array sein. – Lak

+0

Scheint wie ein gültiger Punkt. Lass es mich ausprobieren. –

0

Buchen der Lösung für alle auf der gleichen Arbeit.

In dem Beispiel, das in der Frage gezeigt wird, haben die von der ml-Engine zum Modell gegebenen Eingaben die Form [1, N, m], wobei N die Anzahl der Eingaben und m die Merkmalsgröße ist. So konvertiert die Eingaben in diesem Format verwenden tf.squeeze() wie folgt:

x = tf.placeholder('float', shape=[1, None, 3], name='x') 
x_exp = tf.squeeze(x, axis=0) 

Jetzt Sie x_exp für die weitere Verarbeitung verwenden können.

Verwandte Themen