Прогноз не удался во время выполнения модели с tenorflow 1.6 и ml-engine. Они должны быть совместимы

Я использовал tensorflow1.6 для обучения модели SSD-inception-v2 с нуля. Предупреждений и ошибок не было. Затем я экспортировал модель, используя следующие флаги:

--pipeline_config_path experiments/ssd_inception_v2/ssd_inception_v2.config
--trained_checkpoint_prefix experiments/ssd_inception_v2/train/model.ckpt-400097
--output_directory experiments/ssd_inception_v2/frozen_graphs/

После этого я загрузил saved_mode.pb в корзину Google Cloud Storage, создал модель в ml-движке и создал версию (я действительно использовал --runtime-version=1.6).

Наконец, я использовал команду gcloud, чтобы запросить онлайн-прогноз, но получил следующую ошибку:

{
"error": "Prediction failed: Error during model execution: AbortionError(code=StatusCode.INVALID_ARGUMENT, details="The second input must be a scalar, but it has shape [1]\n\t [[Node: map/while/decode_image/cond_jpeg/cond_png/DecodePng/Switch = Switch[T=DT_STRING, _class=["loc:/TensorArrayReadV3"], _device="/job:localhost/replica:0/task:0/device:CPU:0"](map/while/TensorArrayReadV3, map/while/decode_image/is_jpeg)]]")"
}

Журнал описывает проблему, возникшую при выполнении модели.


person Rodrigo Loza    schedule 05.04.2018    source источник
comment
Не могли бы вы рассказать, как вы создаете содержимое файла, который используете с помощью команды gcloud?   -  person rhaertel80    schedule 05.04.2018
comment
Конечно, pastebin.com/D6nzSBkG Кстати, спасибо за помощь.   -  person Rodrigo Loza    schedule 06.04.2018
comment
Вы не возражаете предоставить фактическое содержимое файла (с опущенным для ясности содержимым изображения)? Это поможет обеспечить правильность   -  person rhaertel80    schedule 11.04.2018


Ответы (1)


Формат запроса на прогноз: (см. официальную документацию ):

{
  "instances": [
    ...
  ]
}

Согласно это сообщение в блоге об обнаружении объектов, флаг --input_type encoded_image_string_tensor создает модель с единственным входом с именем inputs, которая принимает пакет изображений JPG или PNG. Эти изображения должны быть в кодировке base64. Итак, собрав все вместе, фактический запрос должен выглядеть так:

{
  "instances": [
    {
      "inputs": {
        "b64": "..."
      }
    }
  ]
}

Поскольку существует только один ввод, мы можем использовать сокращенное обозначение, которое в качестве объекта / словаря {"inputs": {"b64": ...}} является просто значением словаря, то есть {"b64" : ...}:

{
  "instances": [
    {
      "b64": "..."
    }
  ]
}

Обратите внимание, что любой из них приемлем, если в модель есть ровно один вход.

Несмотря на то, что это форматы запросов, которые принимает служба, инструмент командной строки gcloud на самом деле не ожидает полного тела запроса. Он ожидает только фактических «экземпляров», то есть вещей между [] в JSON, разделенных символами новой строки. Это означает, что ваш файл должен выглядеть так:

{"b64": "..."}

или это

{"inputs": {"b64": "..."}}

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

Попробуйте что-то вроде следующего кода, чтобы получить результат:

json_data = []
for index, image in enumerate(images, 1):
    with open(image, "rb") as open_file:
        byte_content = open_file.read()
    # Convert to base64
    base64_bytes = b64encode(byte_content)
    # Decode bytes to text
    base64_string = base64_bytes.decode("utf-8")
    # Create dictionary
    raw_data = {"b64": base64_string}

    # Put data to json
    json_data.append(json.dumps(raw_data))

# Write to the file
with open(predict_instance_json, "w") as fp:
    fp.write('\n'.join(json_data))
person rhaertel80    schedule 17.04.2018
comment
Привет, спасибо за предложение. Думаю, я уже пробовал это. Тем не менее я внимательно это проверю. Отправлю, если это сработает. - person Rodrigo Loza; 17.04.2018