Я экспортировал 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])

Этот вопрос не является дубликатом вопроса, размещенного здесь. Этот вопрос посвящен минимальному примеру выполнения вывода SavedModel любого класса модели (не ограничиваясь только tf.estimator) и синтаксису указания имен входных и выходных узлов.

15
jshapy8 27 Авг 2017 в 02:59

3 ответа

Лучший ответ

Как только график загружен, он становится доступным в текущем контексте, и вы можете передавать через него входные данные для получения прогнозов. Каждый сценарий использования отличается, но дополнение к вашему коду будет выглядеть примерно так:

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 - это имя цели прогнозирования. Это зависит от вашего варианта использования.

4
jshapy8 27 Авг 2017 в 08:15

Предполагая, что вам нужны прогнозы в 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 (несмотря на тот факт, что вопрос em> ориентирован на оценщиков, ответ на самом деле применяется независимо от того, как создается SavedModel).

11
rhaertel80 14 Сен 2017 в 07:12

Конструктор tf.estimator.DNNClassifier имеет аргумент, называемый warm_start_from. Вы можете дать ему имя папки SavedModel, и он восстановит ваш сеанс.

0
pushkin 7 Сен 2018 в 18:32