Локально загрузить сохраненную модель тензорного потока .pb из движка облачного машинного обучения Google

Я хотел бы взять модель тензорного потока, которую я обучил онлайн, и запустить ее локально с помощью программы Python, которую я распространяю.

После обучения у меня получается каталог /model с двумя файлами /saved_model.pb и папкой /variables. Каков самый простой способ развернуть это локально?

Я следил за здесь для развертывания замороженных моделей. , но я не могу читать в .pb. Я загрузил save_model.pb прямо в свою рабочую и попробовал

with tf.gfile.GFile("saved_model.pb", "rb") as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())

google.protobuf.message.DecodeError: Truncated message.

Глядя на SO здесь, они предложили другой маршрут .

with tf.gfile.GFile("saved_model.pb", "rb") as f:
    proto_b=f.read()
    graph_def = tf.GraphDef()
    text_format.Merge(proto_b, graph_def) 

builtins.TypeError: a bytes-like object is required, not 'str'

Я нахожу это запутанным, так как

type(proto_b)
<class 'bytes'>
type(graph_def)
<class 'tensorflow.core.framework.graph_pb2.GraphDef'>

Почему ошибка, а не строки?

Как лучше всего развернуть модель, обученную в облаке?

Полный код

import tensorflow as tf
import sys
from google.protobuf import text_format


# change this as you see fit
#image_path = sys.argv[1]
image_path="test.jpg"

# Read in the image_data
image_data = tf.gfile.FastGFile(image_path, 'rb').read()

# Loads label file, strips off carriage return
label_lines = [line.rstrip() for line 
               in tf.gfile.GFile("dict.txt")]

# Unpersists graph from file
with tf.gfile.GFile("saved_model.pb", "rb") as f:
    proto_b=f.read()
    graph_def = tf.GraphDef()
    text_format.Merge(proto_b, graph_def) 

with tf.Session() as sess:
    # Feed the image_data as input to the graph and get first prediction
    softmax_tensor = sess.graph.get_tensor_by_name('conv1/weights:0')

    predictions = sess.run(softmax_tensor, \
                           {'DecodeJpeg/contents:0': image_data})

    # Sort to show labels of first prediction in order of confidence
    top_k = predictions[0].argsort()[-len(predictions[0]):][::-1]

    for node_id in top_k:
        human_string = label_lines[node_id]
        score = predictions[0][node_id]
        print('%s (score = %.5f)' % (human_string, score))

person bw4sz    schedule 27.04.2017    source источник


Ответы (1)


Формат модели, которую вы развернули в службе CloudML Engine, — это SavedModel. Загрузить SavedModel в Python довольно просто с помощью модуля loader:

import tensorflow as tf

with tf.Session(graph=tf.Graph()) as sess:
   tf.saved_model.loader.load(
       sess,
       [tf.saved_model.tag_constants.SERVING],
       path_to_model)

Чтобы выполнить вывод, ваш код почти правильный; вам нужно будет убедиться, что вы загружаете партию в session.run, поэтому просто оберните image_data в список:

# Feed the image_data as input to the graph and get first prediction
softmax_tensor = sess.graph.get_tensor_by_name('conv1/weights:0')

predictions = sess.run(softmax_tensor, \
                       {'DecodeJpeg/contents:0': [image_data]})

# Sort to show labels of first prediction in order of confidence
top_k = predictions[0].argsort()[-len(predictions[0]):][::-1]

for node_id in top_k:
    human_string = label_lines[node_id]
    score = predictions[0][node_id]
    print('%s (score = %.5f)' % (human_string, score))

(Обратите внимание, что, в зависимости от вашего графика, обертывание ваших input_data в список может увеличить ранг вашего тензора прогнозов, и вам нужно будет соответствующим образом скорректировать код).

person rhaertel80    schedule 29.04.2017
comment
Две заметки. loader.load берется из tf.saved_model.loader.load, а директория экспорта указывает на каталог, содержащий ОБА save_model.pb и папку с именем variable. - person bw4sz; 29.04.2017
comment
это круто - person Jason; 05.12.2017