У меня проблемы с выводом из тензорного потока 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, однако этот формат устарел.
Заранее благодарим за любые идеи и подсказки!