Механизм TF-Lite делает весь процесс проверки графа и получения промежуточных значений внутренних узлов немного сложным.Метод get_tensor(...)
, предложенный в другом ответе, не работает.
Как визуализировать граф вывода TF-Lite?
Модели TensorFlow Lite можно визуализировать с помощью visualize.py *Скрипт 1007 * в TensorFlow Lite репозитории .Вам просто нужно:
Имеют ли узлы в моей модели TF эквивалентный в TF-Lite?
NO! Фактически, TF-Lite может изменить ваш график так, чтобы онстать более оптимальным.Вот несколько слов об этом из документации TF-Lite :
Ряд операций TensorFlow может обрабатываться TensorFlow Lite, даже если они не имеют прямого эквивалента.Это касается операций, которые можно просто удалить из графа (tf.identity), заменить тензорами (tf.placeholder) или объединить в более сложные операции (tf.nn.bias_add).Даже некоторые поддерживаемые операции иногда могут быть удалены с помощью одного из этих процессов.
Более того, API TF-Lite в настоящее время не позволяет получать соответствие узлов;трудно интерпретировать внутренний формат TF-Lite.Таким образом, вы не можете получить промежуточные выходные данные для любых узлов, которые вам нужны, даже без еще одной проблемы ниже ...
Можно ли получить промежуточные значения некоторых узлов TF-Lite?
NO! Здесь я объясню, почему get_tensor(...)
не будет работать в TF-Lite.Предположим, что во внутреннем представлении граф содержит 3 тензора вместе с несколькими плотными операциями (узлами) между ними (вы можете думать о tensor1
как о входе и tensor3
как о выходе вашей модели).Во время вывода этого конкретного графика для TF-Lite только требуется 2 буфера, давайте покажем, как.
Во-первых, используйте tensor1
для вычисления tensor2
, применяяdense
операция.Для хранения значений требуется только 2 буфера:
dense dense
[tensor1] -------> [tensor2] -------> [tensor3]
^^^^^^^ ^^^^^^^
bufferA bufferB
Во-вторых, использует значение tensor2
, хранящееся в bufferB
, для вычисления tensor3
... но подождите!Нам больше не нужен bufferA
, поэтому давайте используем его для хранения значения tensor3
:
dense dense
[tensor1] -------> [tensor2] -------> [tensor3]
^^^^^^^ ^^^^^^^
bufferB bufferA
Теперь самое сложное.«Выходное значение» tensor1
будет по-прежнему указывать на bufferA
, которое теперь содержит значения tensor3
.Поэтому, если вы вызовете get_tensor(...)
для первого тензора, вы получите неправильные значения. документация по этому методу даже гласит:
Эту функцию нельзя использовать для чтения промежуточных результатов.
Как обойти это?
Простой, но ограниченный способ. Вы можете указать имена узлов, выходные тензоры которых вы хотите получить во время преобразования:
tflite_convert \
-- # other options of your model
--output_arrays="output_node,intermediate/node/n1,intermediate/node/n2"
Сложный, но гибкий способ. Вы можете скомпилировать TF-Lite с Bazel (используя эту инструкцию ).Затем вы можете ввести код регистрации в Interpreter::Invoke()
в файле tensorflow/lite/interpreter.cc
.Гадкий взлом, но это работает.