Загрузите GCMLE локально и получите активации - PullRequest
0 голосов
/ 06 июня 2018

Я хотел бы просматривать активации локально (например, блокнот jupyter) из saved_model, развернутого в службе прогнозирования GCMLE, чтобы я мог экспериментировать с визуализациями.Я успешно загрузил saved_model в график:

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

У меня также есть словарь request входных данных, которые я мог бы просто передать в развернутую службу прогнозирования (predict_json() включен в конце дляпростота:

responses = predict_json(project, model, instances = [request], version)

Есть ли какой-нибудь способ, которым я могу использовать мой saved_model локально и кормить на входе request, а затем посмотреть на активацию определенных слоев (таких как логиты или выходные данныесверток)? Я полагаю, что я пытаюсь сделать что-то вроде этого:

with tf.Session(graph=tf.Graph()) as sess:
    tf.saved_model.loader.load(sess, [tf.saved_model.tag_constants.SERVING], _VERSION)
    graph = tf.get_default_graph()
    inputs = graph.get_tensor_by_name("input_layer:0")
    activations = graph.get_tensor_by_name("conv1d/bias:0")

    print(sess.run(inputs, activations))

Однако я не могу найти тензорное имя для эквивалента функции входного обслуживания, напримерbody={'instances': instances} в predict_json. Далее, я просто предполагаю, что если я получу смещение свертки по имени, то это будет представлять собой активацию свертки, но я также не уверен в этом (как я нене смог увидеть, что они есть).

GCMLE predict_json() Для справки

def predict_json(project, model, instances, version=None):
"""Send json data to a deployed model for prediction.

Args:
    project (str): project where the Cloud ML Engine Model is deployed.
    model (str): model name.
    instances ([Mapping[str: Any]]): Keys should be the names of Tensors
        your deployed model expects as inputs. Values should be datatypes
        convertible to Tensors, or (potentially nested) lists of datatypes
        convertible to tensors.
    version: str, version of the model to target.
Returns:
    Mapping[str: any]: dictionary of prediction results defined by the
        model.
"""
# Create the ML Engine service object.
# To authenticate set the environment variable
# GOOGLE_APPLICATION_CREDENTIALS=<path_to_service_account_file>
service = googleapiclient.discovery.build('ml', 'v1')
name = 'projects/{}/models/{}'.format(project, model)

if version is not None:
    name += '/versions/{}'.format(version)

response = service.projects().predict(
    name=name,
    body={'instances': instances}
).execute(num_retries=2)

if 'error' in response:
    raise RuntimeError(response['error'])

return response['predictions']

1 Ответ

0 голосов
/ 13 июня 2018

Ваш общий подход верен.

Вы можете использовать saved_model_cli для проверки имен тензоров входов и выходов, например (из вышеупомянутых документов):

saved_model_cli show --dir \
/tmp/saved_model_dir --tag_set serve --signature_def serving_default

Может выводить что-то вроде:

The given SavedModel SignatureDef contains the following input(s):
inputs['x'] tensor_info:
    dtype: DT_FLOAT
    shape: (-1, 1)
    name: x:0
The given SavedModel SignatureDef contains the following output(s):
outputs['y'] tensor_info:
    dtype: DT_FLOAT
    shape: (-1, 1)
    name: y:0
Method name is: tensorflow/serving/predict

Вы можете видеть, что вход x отображается на имя тензора x:0.

Конечно, поиск именне входные тензоры немного сложнее.Если вы строите график с нуля, вы можете дать тензору понятное имя, добавив name="XXX" к опциям.В противном случае вам придется сделать что-то вроде дампа SavedModel, например,

from tensorflow.core.protobuf import saved_model_pb2
s = saved_model_pb2.SavedModel()
with open("saved_model.pb") as f:
  s.ParseFromString(f.read())
print(s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...