2017-12-20 16 views
2

私はあなたの助けを必要としています。Tensorflow:サービングモデルは常に同じ予測を返します

私はとてもいい結果が得られる分類tensorflowモデルを再教育。 今、私はテンソルフローサービングを通じてそれを提供したいと思います。 私はそれを提供することができましたが、私がそれを使用しているときは、入力が何であっても常に同じ結果が得られます。

私が何か間違ったことは、私がモデルをエクスポートするが、私は何を把握することはできません方法があると思います。以下は私のコードです。

誰かが私を助けることができますか?おかげでたくさんの男

これは、TFのために読めるオブジェクトに私の入力画像を変換する機能である:

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 

そして、これは私が私のモデルをエクスポートする方法である:

# 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(predict_inputs_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

私はまったく同じ問題を抱えています。これで進歩はありましたか? –

答えて

1

私は戦いを持って、同じ問題がありました反対してください。最後に、私はモデルでfloat32のDouble型を送信していたことが判明し、何らかの形でtensowflowがこのdoubleを0にキャストしました。つまり、RPC経由で送信したものは、モデルでは0になります。それが役に立てば幸い。

+0

こんにちは、あなたの助けをたくさんありがとう、私は今夜それをテストします! – Machin

+0

こんにちは、私は2つのテストを行った: – Machin

+0

こんにちは、私は2つのテストを行った:最初に私はRPCクライアントの部分をチェック、私は2つのdifferentsの画像とprotoに作成します。入力として使用されるプロトタイプはまったく異なっています。私にとっては、提供されるモデルに送信される入力が異なることを意味します。 2番目のテストは、サービングシグネチャを作成するために渡されたテンソル情報をチェックすることでした。私が得た価値は以下の通りです。私はあなたが記述したエラーがどこで発生する可能性がありますか?おかげで再び 名predict_inputs_tensor_infoあなたの助け@Ozumサファ – Machin

関連する問題