Я пытаюсь отладить свою tflite
модель, в которой используются специальные операции. Я обнаружил соответствие между именами операций (в *.pb
) и идентификаторами операций (в *.tflite
), и я провожу сравнение уровня на слой (чтобы убедиться, что разница выходов всегда находится в диапазоне 1e-4
(поскольку он взрывается в конце я хочу найти точное место, где мой пользовательский слой не работает) следующим образом:
Метод 1. Я использую get_tensor
, чтобы получить следующий результат:
from tensorflow.contrib.lite.python import interpreter
# load the model
model = interpreter.Interpreter(model_path='model.tflite')
model.allocate_tensors()
# get tensors
for i in tensor_ids:
tensor_output[i] = model.get_tensor(i)
Он показывает совершенно неадекватные случайные значения (по сравнению с выходными данными модели TensorFlow).
Метод 2. Преобразуйте *.pb
только до определенного уровня, а затем повторите, в основном:
Создайте
*.pb
, чтобы он содержал сеть только отinput
доlayer_1
.Преобразуйте в
tflite
(теперь результат будетlayer_1
) и проверьте выходные данные TF-Lite с помощью TensorFlow.Повторите шаги 1-2 для
layer_2
,layer_3
, ...outputs
.
Этот метод требует гораздо больше работы и выполнения, но он правильно показывает, что для встроенных операций выходы моделей tflite
и pb
были идентичны, и только начинает различаться в моих пользовательских операциях (в то время как в методе 1 выходы расходятся сразу от первых слоев).
Вопрос: Почему
get_tensor
так странно ведет себя? Может быть, это потому, что я используюtensorflow 1.9
(когда TF-Lite еще не был выпущен и был доступен только в предварительной версии для разработчиков)?
PS: Мне известно о выпуске TF-Lite, но я вручную скомпилировал TensorFlow 1.9 для своего проекта, и теперь трудно изменить управление версиями.