Визуализировать график TFLite и получить промежуточные значения конкретного узла? - PullRequest
1 голос
/ 04 июля 2019

Мне было интересно, есть ли способ узнать список входов и выходов для конкретного узла в tflite? Я знаю, что могу получить детали ввода / вывода, но это не позволяет мне реконструировать процесс вычислений, который происходит внутри Interpreter. Итак, что я делаю:

interpreter = tf.lite.Interpreter(model_path=model_path)
interpreter.allocate_tensors()

input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
interpreter.get_tensor_details()

Последние 3 команды в основном дают мне словари, в которых, похоже, нет необходимой информации.

Так что мне было интересно, есть ли способ узнать, куда направляются выходные данные каждого узла? Конечно, Interpreter знает это как-то. Мы можем? Спасибо.

Ответы [ 3 ]

1 голос
/ 10 июля 2019

Механизм 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.Гадкий взлом, но это работает.

0 голосов
/ 24 июля 2019

''» tflite_convert \ - # другие варианты вашей модели --output_arrays = "output_node, промежуточный продукт / узел / n1, промежуточный продукт / узел / п2" '' '

Любая идея, как указать этот выходной массив при преобразовании из сохраненной модели dir / Keras, вместо замороженного графика. Найдите подробный вопрос ниже

SavedModel - TFLite - SignatureDef - TensorInfo - Получить выходные данные промежуточного уровня

0 голосов
/ 08 июля 2019

tf.lite.Interpreter предоставляет API для просмотра модели на уровне тензора (https://www.tensorflow.org/api_docs/python/tf/lite/Interpreter#get_tensor).). Таким образом, в основном вам необходимо знать индексы тензора как для входных, так и для выходных данных узел, а затем вызывать "get_tensor ()" при каждом выводе.

...