Доступ к тензорам ввода и вывода SavedModel тензорного потока 2.0 через C API

У меня проблемы с выводом из тензорного потока 2.0. SavedModel загрузил C_API, потому что я не могу получить доступ к операциям ввода и вывода по имени.

Я успешно загружаю сеанс через TF_LoadSessionFromSavedModel (...):

#include <tensorflow/c/c_api>

...

TF_Status* status = TF_NewStatus();
TF_Graph*  graph  = TF_NewGraph();
TF_Buffer* r_opts = TF_NewBufferFromString("",0);
TF_Buffer* meta_g = TF_NewBuffer();

TF_SessionOptions* opts = TF_NewSessionOptions();
const char* tags[] = {"serve"};

TF_Session* session = TF_LoadSessionFromSavedModel(opts, r_opts, "saved_model/tf2_model", tags, 1, graph, meta_g, status);

if ( TF_GetCode(status) != TF_OK ) exit(-1); //does not happen

Однако я получаю сообщение об ошибке при попытке настроить тензоры ввода и вывода, используя:

TF_Operation* inputOp  = TF_GraphOperationByName(graph, "input"); //works with "serving_default_input"
TF_Operation* outputOp = TF_GraphOperationByName(graph, "prediction"); //does not work

Имена, которые я передаю в качестве аргументов, назначаются входным и выходным слоям keras сохраненной модели, но не находятся в загруженном graph. Запуск saved_model_cli (следуя здесь руководству tf SavedModel) показывает, что теноры с этими именами существуют под SignatureDef serving_default, поэтому я предполагаю, что мне нужно создать экземпляр serving_default в граф (другими словами, создать граф в соответствии с подписью), однако я не смог найти способ сделать это с помощью C API.

Обратите внимание, что тест тензорных потоков C ++ использует тензорный поток / ядро ​​C ++. / функциональность для загрузки карты определения сигнатуры из метаграфа и использования ее для поиска имен операций ввода и вывода, но я бы хотел избежать зависимости от C ++.

Также обратите внимание, что доступ к операциям по имени работает для замороженных графиков .pb, однако этот формат устарел.

Заранее благодарим за любые идеи и подсказки!


person javor    schedule 21.11.2019    source источник
comment
В этом руководстве, кажется, есть решение этой проблемы, хотя и не такое элегантное, потому что вам все еще нужно анализировать определенные подписи через saved_model_cli medium.com/analytics-vidhya/   -  person Bersan    schedule 18.05.2020


Ответы (1)


В настоящее время (по состоянию на май 2020 г.) API Tensorflow C официально не поддерживает формат SavedModel (tensorflow 2.0), хотя они, вероятно, выпустят функциональность скоро.

Тем не менее, вы можете использовать значения по умолчанию SignatureDefs, определенные при экспорте модели, и найти имена входных и выходных тензоров, используя saved_model_cli.

Скажем, вы сохранили свою модель, используя

model.save('/path/to/model/folder')

Затем вы открываете bash и делаете

cd /python/folder/bin/
saved_model_cli show --dir /path/to/model/folder --tag_set serve --signature_def serving_default

(фактическое расположение saved_model_cli может быть разным, но он устанавливается по умолчанию при использовании анаконды в bin / папке)

по умолчанию он даст что-то вроде:

serving_default
The given SavedModel SignatureDef contains the following input(s):
  inputs['graph_input'] tensor_info:
      dtype: DT_DOUBLE
      shape: (-1, 28, 28)
      name: serving_default_graph_input:0
The given SavedModel SignatureDef contains the following output(s):
  outputs['graph_output'] tensor_info:
      dtype: DT_FLOAT
      shape: (-1, 10)
      name: StatefulPartitionedCall:0
Method name is: tensorflow/serving/predict

В этом случае serve_default_graph_input - это имя входного тензора, а StatefulPartitionedCall - имя выходного тензора. Затем вы можете загрузить их, используя TF_GraphOperationByName().

Благодаря поддержке C API для Tensorflow 2 вы сможете сохранить модель с набором определенных SignatureDefs, а затем загрузить желаемый concrete_function(), не беспокоясь о тензорных именах. Однако этот текущий метод должен работать.

person Bersan    schedule 24.05.2020