Ошибка «Tensor Placeholder» при прогнозировании в качестве тензорного потока saveModel с типом ввода в виде строки - PullRequest
1 голос
/ 28 апреля 2019

Я экспортировал свою модель keras в tenorflow SavedModel и загрузил ее в облачный движок ML для прогнозов. Когда я отправляю запрос json (с вводом в виде числа с плавающей запятой), он правильно выполняет прогнозы. Но когда я отправляю запрос json (со строкой изображения в кодировке base64), я получаю сообщение об ошибке «Tensor Placeholder_107: 0, указанный либо в feed_devices, либо в fetch_devices, не найден в графике»

K.clear_session()
sess = tf.Session()
K.set_session(sess)
K.set_learning_phase(0)
model = load_model('modelName.h5')

image = tf.placeholder(shape=[None], dtype=tf.string)
export_path = 'path-name'

builder = saved_model_builder.SavedModelBuilder(export_path)

signature = predict_signature_def(inputs={'image_bytes': image},
                              outputs={'scores': model.output})

with K.get_session() as sess:
  builder.add_meta_graph_and_variables(sess=sess,
                                     tags=[tag_constants.SERVING],
                                     signature_def_map={
                                         'predict': signature})

builder.save()        

MetaGraphDef с набором тегов: 'serve' содержит следующие SignatureDefs:

signature_def ['предсказание']:

Указанный SavedModel SignatureDef содержит следующие данные:

      inputs['images'] tensor_info:
       dtype: DT_STRING
       shape: (-1)
       name: Placeholder_107:0                                     

Указанный SavedModel SignatureDef содержит следующие выходные данные:

   outputs['scores'] tensor_info:
    dtype: DT_FLOAT
    shape: (-1, 2)
    name: activation_14/Softmax:0

Имя метода: тензор потока / обслуживание / прогноз

Передали данные изображения, чтобы преобразовать его в файл JSON, чтобы его можно было отправить в облачный движок ML для прогнозирования.

from base64 import b64encode
from json import dumps
import json

with open(IMAGE_NAME, 'rb') as open_file:
   byte_content = open_file.read()
base64_bytes = b64encode(byte_content)                      
raw_data = {IMAGE_NAME: base64_bytes}
request_body= json.dumps({'images': base64_bytes})
with open('test_data.json', 'w') as outfile:
 outfile.write(request_body)

Затем я передаю этот json (кодирование base64 изображения) в облачный движок ML

  !gcloud ml-engine predict --model model-name --version version_3 --json-instances test_data.json

Я получаю ошибку ниже

 ['{', '  "error": "Prediction failed: Error during model execution: AbortionError(code=StatusCode.INVALID_ARGUMENT, details=\\"Tensor Placeholder_107:0, specified in either feed_devices or fetch_devices was not found in the Graph\\")"', '}']

Ранее я отправил вход модели в виде числа с плавающей запятой, как показано ниже

  signature = predict_signature_def(inputs={'image_bytes': image},
                              outputs={'scores': model.output})

в то время

Указанный SavedModel SignatureDef содержит следующие данные:

   inputs['images'] tensor_info:
     dtype: DT_FLOAT
     shape: (-1, 96, 96, 3)
     name: conv2d_6_input:0

Я подозреваю, что проблема связана с этой строкой. tf.placeholder (shape = [None], dtype = tf.string).

Как только я изменил определение подписи, чтобы принять tf.placeholder, я столкнулся с проблемой. Я использую tf.placeholder, чтобы он принимал ввод как строку.

Я пробовал много способов увидеть некоторые входные данные от решений SO, но это не помогло

Пожалуйста, совет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...