web-dev-qa-db-ja.com

TensorFlow:SavedModelから予測する方法は?

SavedModelをエクスポートしたので、それを再度ロードして予測を行います。次の機能とラベルでトレーニングされました。

F1 : FLOAT32
F2 : FLOAT32
F3 : FLOAT32
L1 : FLOAT32

だから私は値20.9, 1.8, 0.9単一のFLOAT32予測。どうすればこれを達成できますか?モデルを正常にロードできましたが、予測呼び出しを行うためにモデルにアクセスする方法がわかりません。

with tf.Session(graph=tf.Graph()) as sess:
    tf.saved_model.loader.load(
        sess,
        [tf.saved_model.tag_constants.SERVING],
        "/job/export/Servo/1503723455"
    )

    # How can I predict from here?
    # I want to do something like prediction = model.predict([20.9, 1.8, 0.9])

この質問は、投稿された質問の複製ではありません here 。この質問は、任意のモデルクラスのSavedModelで推論を実行する最小限の例に焦点を当てています(tf.estimator)および入力および出力ノード名を指定する構文。

11
jshapy8

グラフがロードされると、現在のコンテキストで使用できるようになり、入力データをフィードして予測を取得できます。各ユースケースはかなり異なりますが、コードへの追加は次のようになります。

with tf.Session(graph=tf.Graph()) as sess:
    tf.saved_model.loader.load(
        sess,
        [tf.saved_model.tag_constants.SERVING],
        "/job/export/Servo/1503723455"
    )

    prediction = sess.run(
        'prefix/predictions/Identity:0',
        feed_dict={
            'Placeholder:0': [20.9],
            'Placeholder_1:0': [1.8],
            'Placeholder_2:0': [0.9]
        }
    )

    print(prediction)

ここでは、予測入力の名前を知る必要があります。 serving_fnで身廊を与えなかった場合、デフォルトはPlaceholder_nになります。ここで、nはn番目の機能です。

sess.runの最初の文字列引数は、予測ターゲットの名前です。これは、ユースケースに応じて異なります。

3
jshapy8

Pythonで予測が必要だとすると、 SavedModelPredictor はおそらくSavedModelをロードして予測を取得する最も簡単な方法です。次のようにモデルを保存するとします。

# Build the graph
f1 = tf.placeholder(shape=[], dtype=tf.float32)
f2 = tf.placeholder(shape=[], dtype=tf.float32)
f3 = tf.placeholder(shape=[], dtype=tf.float32)
l1 = tf.placeholder(shape=[], dtype=tf.float32)
output = build_graph(f1, f2, f3, l1)

# Save the model
inputs = {'F1': f1, 'F2': f2, 'F3': f3, 'L1': l1}
outputs = {'output': output_tensor}
tf.contrib.simple_save(sess, export_dir, inputs, outputs)

(入力は任意の形状にすることができ、グラフのプレースホルダーやルートノードである必要さえありません)。

そして、Python SavedModelを使用するプログラムで、次のような予測を取得できます。

from tensorflow.contrib import predictor

predict_fn = predictor.from_saved_model(export_dir)
predictions = predict_fn(
    {"F1": 1.0, "F2": 2.0, "F3": 3.0, "L1": 4.0})
print(predictions)

この回答 は、Java、C++、およびPython(questionは推定量に焦点を合わせており、実際の答えはSavedModelの作成方法とは無関係に適用されます)。

11
rhaertel80

訓練された缶詰のモデルを保存し、テンソルフローを提供せずに提供する実用的な例を必要とする人のために、私はここに文書化しています https://github.com/tettusud/tensorflow-examples/tree/master/estimators

  1. tf.tensorflow.contrib.predictor.from_saved_model( exported_model_path)から予測子を作成できます
  2. 入力を準備する

    tf.train.Example( 
        features= tf.train.Features(
            feature={
                'x': tf.train.Feature(
                     float_list=tf.train.FloatList(value=[6.4, 3.2, 4.5, 1.5])
                )     
            }
        )    
    )
    

ここで、xは、エクスポート時にinput_receiver_functionで指定された入力の名前です。例えば:

feature_spec = {'x': tf.FixedLenFeature([4],tf.float32)}

def serving_input_receiver_fn():
    serialized_tf_example = tf.placeholder(dtype=tf.string,
                                           shape=[None],
                                           name='input_tensors')
    receiver_tensors = {'inputs': serialized_tf_example}
    features = tf.parse_example(serialized_tf_example, feature_spec)
    return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)
6
sudharsan tk

tf.estimator.DNNClassifierのコンストラクターには、warm_start_fromという引数があります。 SavedModelフォルダー名を付けると、セッションが回復します。

0
udifuchs