2017-12-20 3 views
2

Ich brauche deine Hilfe Ich bin ein wenig stecken jetzt.Tensorflow: Serving-Modell Rückkehr immer die gleiche Vorhersage

Ich trainiere eine Klassifizierung Tensorflow-Modell, das ziemlich schöne Ergebnisse gibt. Jetzt möchte ich es durch Tensorflow dienen dienen. Ich habe es geschafft, aber wenn ich es benutze, gibt es mir immer die gleichen Ergebnisse, egal was die Eingabe ist.

Ich denke, es ist etwas falsch, wie ich das Modell exportieren, aber ich kann nicht herausfinden, was. Unten ist mein Code.

Kann mir jemand helfen? Vielen Dank Jungs

Dies ist die Funktion, die meine Eingangsbild in ein lesbares Objekt für tf-Transformation:

def read_tensor_from_image_file(file_name, input_height=299, input_width=299, 
      input_mean=0, input_std=255): 
    input_name = "file_reader" 
    output_name = "normalized" 
    file_reader = tf.read_file(file_name, input_name) 
    if file_name.endswith(".png"): 
    image_reader = tf.image.decode_png(file_reader, channels = 3, 
            name='png_reader') 
    elif file_name.endswith(".gif"): 
image_reader = tf.squeeze(tf.image.decode_gif(file_reader, 
               name='gif_reader')) 
    elif file_name.endswith(".bmp"): 
image_reader = tf.image.decode_bmp(file_reader, name='bmp_reader') 
    else: 
image_reader = tf.image.decode_jpeg(file_reader, channels = 3, 
            name='jpeg_reader') 
    float_caster = tf.cast(image_reader, tf.float32) 
    dims_expander = tf.expand_dims(float_caster, 0); 
    resized = tf.image.resize_bilinear(dims_expander, [input_height, input_width]) 
    normalized = tf.divide(tf.subtract(resized, [input_mean]), [input_std]) 
    sess = tf.Session() 
    result = sess.run(normalized) 

    return result,normalized 

Und das ist, wie ich mein Modell exportieren:

# Getting graph from the saved pb file 
    graph = tf.Graph() 
    graph_def = tf.GraphDef() 
    with open(model_file, "rb") as f: 
    graph_def.ParseFromString(f.read()) 
    with graph.as_default(): 
    tf.import_graph_def(graph_def) 

    # below, var "t" is the result of the transformation, "tf_input" a tensor before computation. 
    t,predict_inputs_tensor = read_tensor_from_image_file(file_name, 
           input_height=input_height, 
           input_width=input_width, 
           input_mean=input_mean, 
           input_std=input_std) 

    input_name = "import/" + input_layer 
    output_name = "import/" + output_layer 

    input_operation = graph.get_operation_by_name(input_name); 
    output_operation = graph.get_operation_by_name(output_name); 

    # Let's predict result to get an exemple output 
    with tf.Session(graph=graph) as sess: 
    results = sess.run(output_operation.outputs[0], 
        {input_operation.outputs[0]: t}) 
    results = np.squeeze(results) 


    # Creating labels 
    class_descriptions = [] 
    labels = load_labels(label_file) 
    for s in labels: 
    class_descriptions.append(s) 
    classes_output_tensor = tf.constant(class_descriptions)  
    table = 
tf.contrib.lookup.index_to_string_table_from_tensor(classes_output_tensor) 
classes = table.lookup(tf.to_int64(labels)) 

    top_k = results.argsort()[-len(labels):][::-1] 
    scores_output_tensor, indices =tf.nn.top_k(results, len(labels)) 

    # Display 
    for i in top_k: 
    print(labels[i], results[i]) 


    version=1 
    path="/Users/dboudeau/depot/tensorflow-for-poets-2/tf_files" 

    tf.app.flags.DEFINE_integer('version', version, 'version number of the model.') 
    tf.app.flags.DEFINE_string('work_dir', path, 'your older model directory.') 
    tf.app.flags.DEFINE_string('model_dir', '/tmp/magic_model', 'saved model directory') 
    FLAGS = tf.app.flags.FLAGS 

    with tf.Session() as sess: 
     classify_inputs_tensor_info = 
tf.saved_model.utils.build_tensor_info(predict_inputs_tensor) 

    export_path = os.path.join(
     tf.compat.as_bytes(FLAGS.model_dir) 
     ,tf.compat.as_bytes(str(FLAGS.version)) 
    ) 

    print(export_path) 
    builder = tf.saved_model.builder.SavedModelBuilder(export_path) 

    # define the signature def map here   

predict_inputs_tensor_info = tf.saved_model.utils.build_tensor_info (Vorhersage_Eingabe_tensor) classes_output_tensor_info = tf.saved_model.utils.build_tensor_info (cl asses_output_tensor) scores_output_tensor_info = tf.saved_model.utils.build_tensor_info (scores_output_tensor)

classification_signature = (
    tf.saved_model.signature_def_utils.build_signature_def(
       inputs={ 
        tf.saved_model.signature_constants.CLASSIFY_INPUTS: 
         classify_inputs_tensor_info 
       }, 
       outputs={ 
        tf.saved_model.signature_constants.CLASSIFY_OUTPUT_CLASSES: 
         classes_output_tensor_info, 
        tf.saved_model.signature_constants.CLASSIFY_OUTPUT_SCORES: 
         scores_output_tensor_info 
       }, 
       method_name=tf.saved_model.signature_constants. 
       CLASSIFY_METHOD_NAME)) 

    prediction_signature = (
      tf.saved_model.signature_def_utils.build_signature_def(
       inputs={'images': predict_inputs_tensor_info}, 
       outputs={ 
        'classes': classes_output_tensor_info, 
        'scores': scores_output_tensor_info 
       }, 

method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME 
     )) 

    legacy_init_op = tf.group(tf.tables_initializer(), name='legacy_init_op') 

    # This one does' 
    final_sdn={ 

tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: classification_signature, }

builder.add_meta_graph_and_variables(
     sess, [tf.saved_model.tag_constants.SERVING], 
     signature_def_map=final_sdn, 
     legacy_init_op=legacy_init_op) 

    builder.save() 
+0

Ich habe genau das gleiche Problem. Hast du Fortschritte dabei? –

Antwort

1

Ich habe das gleiche Problem hatte ich Schlacht haben gegen eine Weile. Am Ende stellte sich heraus, dass ich den Double-Typ für einen float32 im Modell sendete und irgendwie tensowflow diesen Double-Wert auf 0 warf. Dies bedeutet, dass alles, was Sie über RPC senden, im Modell als 0 angenommen wird. Ich hoffe es hilft.

+0

Hallo Vielen Dank für Ihre Hilfe, ich werde es heute Abend testen! – Machin

+0

Hallo, ich habe 2 Tests gemacht: – Machin

+0

Hi, ich habe 2 Tests gemacht: Zuerst checke ich den RPC Client Teil ein, ich erstelle mit zwei verschiedenen Bildern Proto. Wie erwartet, ist das als Input verwendete Proto- koll völlig anders. Für mich bedeutet das, dass die Eingabe, die an das Served-Modell gesendet wird, anders ist. Der zweite Test bestand darin, die Tensor-Informationen zu überprüfen, die zum Erstellen der Serving-Signatur übergeben wurden. Unten sind die Werte, die ich bekomme. Ich sehe nicht, wo der beschriebene Fehler auftreten könnte?Nochmals vielen Dank für Ihre Hilfe @Ozum Safa – Machin

Verwandte Themen