Tensorflow в C++: успешное чтение буфера протокола для модели декодера кодировщика LSTM

Я отлаживаю эту проблему некоторое время. Я разработал модель кодировщика-декодера LSTM, которую я планирую развернуть на C++.

Сохранив модель в формате файла .pb, я могу импортировать модель и данные и развернуть их в Python. Однако, когда я пытаюсь импортировать график с помощью C++ API, функция TF_GraphImportGraphDef() возвращает код ошибки TF_NOT_FOUND. Я подозреваю, что это связано с тем, что я использую метод поиска луча, а символы для операции GatherTree не содержатся в tensorflow.dll/lib, которые я сгенерировал с помощью Bazel в Windows.

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

Будет ли ссылка на _beam_search_ops.dll возможным решением? Я тоже пробовал это, используя функцию TF_LoadLibrary(), доступную в файле c_api.h. Однако мне не удалось загрузить библиотеку.

Любые входы будут оценены. Кроме того, я работаю с tensorflow версии 1.14.


person Narayan Narvekar    schedule 01.11.2019    source источник
comment
Вы проверили сообщение в структуре TF_Status? (вы можете получить это с помощью TF_Message()). Насчет загрузки дополнительной DLL, TF_LoadLibrary должно работать, почему у вас не работает?   -  person jdehesa    schedule 01.11.2019
comment
Привет, я только что нашел решение, в котором по какой-то причине мне также пришлось связать библиотеку _pywrap_tensorflow_internal.pyd. (Источник: stackoverflow.com/questions/50115117/). Теперь dll можно успешно загрузить. Однако, когда я пытаюсь импортировать график, он все еще терпит неудачу, но на этот раз с другим кодом ошибки, а именно TF_INVALID_ARGUMENT. Что означают эти коды ошибок? Есть ли какая-либо документация по ним?   -  person Narayan Narvekar    schedule 01.11.2019
comment
@NarayanNarvekar Проверьте документы по этим ошибкам здесь: tensorflow.org/api_docs/python/ tf/errors/InvalidArgumentError This may occur, for example, if an operation is receives an input tensor that has an invalid value or shape. For example, the tf.matmul op will raise this error if it receives an input that is not a matrix, and the tf.reshape op will raise this error if the new shape does not match the number of elements in the input tensor. Странно, что вы видите это при импорте графика — обычно я ожидаю, что такая ошибка произойдет во время логического вывода.   -  person HanClinto    schedule 01.11.2019
comment
@HanClinto Я тоже наткнулся на это и понял, что это не имеет особого смысла в этой проблеме. И это правда. Ошибки фактически идентичны значениям ошибок в error_codes.proto. Прочитав сообщение об ошибке с помощью метода TF_Message(), я понял, что это проблема несоответствия версий загруженных DLL. Далее я опубликую решение, которое сработало для меня.   -  person Narayan Narvekar    schedule 01.11.2019


Ответы (1)


Итак, я копнул глубже и смог найти решение для следующих проблем, которые позволили мне успешно загрузить сохраненную модель декодера кодировщика LSTM с помощью C ++ API:

Ошибка TF_NOT_FOUND. Сообщение об ошибке выглядит следующим образом: сообщение: тип операции не зарегистрирован "GatherTree" в двоичном файле, работающем на LAPTOP-5R9P6BHL. Убедитесь, что Op и Kernel зарегистрированы в двоичном файле, работающем в этом процессе. Обратите внимание: если вы загружаете сохраненный граф, в котором использовались операции из tf.contrib, доступ (например) tf.contrib.resampler должен быть выполнен до импорта графа, поскольку операции contrib лениво регистрируются при первом доступе к модулю. На этом этапе , я только связал tensorflow.dll и tensorflow.lib с моим проектом C++. Возможное решение состояло в том, чтобы связать библиотеку, содержащую определение для операции Gather Tree op, которой была _beam_search_ops.dll.

Ошибка _beam_search_ops.dll не найдена: эта ошибка наблюдалась при попытке загрузить библиотеку с помощью TF_LoadLibrary() из c_api.h. После просмотра некоторых сообщений о переполнении стека показалось, что библиотека зависит от библиотек python37.dll и _pywrap_tensorflow_internal.pyd. И после связывания этих двух библиотек я успешно смог загрузить _beam_search_ops.dll.

Ошибка TF_INVALID_ARGUMENT: даже после загрузки библиотеки _beam_search_ops.dll импорт графика завершился неудачно из-за ошибки недопустимого аргумента. Прочитав сообщение об ошибке, я понял, что это произошло из-за того, что _beam_search_ops.dll и _pywrap_tensorflow_internal.pyd были сгенерированы с помощью tensorflow V1.13 и tensorflow.dll/lib и Файл .pb создается с помощью tensorflow V1.14. Когда я связал _beam_search_ops.dll и _pywrap_tensorflow_internal.pyd из версии tensorflow V1.14, загрузка графа прошла успешно, и я смог прочитать содержимое график.

Если у кого-то есть лучшее решение этой проблемы, пожалуйста, опубликуйте его здесь. Спасибо.

person Narayan Narvekar    schedule 02.11.2019