Учитывая граф тензорной модели потока, как найти имена входных и выходных узлов

Я использую пользовательскую модель для классификации в Tensor flow Camera Demo. Я создал файл .pb (сериализованный файл protobuf) и смог отобразить огромный график, который он содержит. Чтобы преобразовать этот график в оптимизированный, как указано в [https://www.oreilly.com/learning/tensorflow-on-android] можно использовать следующую процедуру:

$ bazel-bin/tensorflow/python/tools/optimize_for_inference  \
--input=tf_files/retrained_graph.pb \
--output=tensorflow/examples/android/assets/retrained_graph.pb
--input_names=Mul \
--output_names=final_result

Здесь, как найти input_names и output_names из отображения графика. Когда я не использую собственные имена, я получаю сбой устройства:

E/TensorFlowInferenceInterface(16821): Failed to run TensorFlow inference 
with inputs:[AvgPool], outputs:[predictions]

E/AndroidRuntime(16821): FATAL EXCEPTION: inference

E/AndroidRuntime(16821): java.lang.IllegalArgumentException: Incompatible 
shapes: [1,224,224,3] vs. [32,1,1,2048]

E/AndroidRuntime(16821):     [[Node: dropout/dropout/mul = Mul[T=DT_FLOAT, 
_device="/job:localhost/replica:0/task:0/cpu:0"](dropout/dropout/div, 
dropout/dropout/Floor)]]

person Santle Camilus    schedule 20.04.2017    source источник
comment
Привет, @ Dr.SantleCamilus, у вас есть решение?   -  person Uma Achanta    schedule 28.08.2017
comment
да, упоминание правильных имен узлов ввода и вывода необходимо для работы демонстрации Android TF. Некоторые старые обучающие программы TF могут не включать эти имена в модель. Наличие имен узлов можно узнать по приведенному ниже ответу JP Kim. Если имена отсутствуют, необходимо перейти на новый обучающий код TF, чтобы включить правильные имена узлов.   -  person Santle Camilus    schedule 28.08.2017
comment
Я получаю такой результат * [u'image_tensor = ›Placeholder '] *   -  person Uma Achanta    schedule 28.08.2017
comment
не могли бы вы помочь мне, что это значит?   -  person Uma Achanta    schedule 28.08.2017
comment
[u'image_tensor = ›Placeholder '] означает, что имя вашего входного узла -' 'image_tensor (/ вы можете использовать --input_names = image_tensor при определении optimize_for_interface)   -  person Santle Camilus    schedule 29.08.2017
comment
@ Dr.Santle-camilus - какое у вывода имя? Это показывает ошибку, поскольку узел не существует с выводом имени. поскольку я сохранил вывод как output_name. Пожалуйста помоги   -  person Uma Achanta    schedule 30.08.2017
comment
Пожалуйста, проверьте наличие узла softmax в вашей модели, используя ответ JP Kim ниже. Если он что-то возвращает, используйте то же имя для имени вывода. Выходное имя - это конкретный узел, который генерирует выходные данные сети CNN.   -  person Santle Camilus    schedule 30.08.2017


Ответы (3)


Попробуй это:

запустить питон

>>> import tensorflow as tf
>>> gf = tf.GraphDef()
>>> gf.ParseFromString(open('/your/path/to/graphname.pb','rb').read())

а потом

>>> [n.name + '=>' +  n.op for n in gf.node if n.op in ( 'Softmax','Placeholder')]

Тогда вы можете получить результат, подобный этому:

['Mul=>Placeholder', 'final_result=>Softmax']

Но я не уверен, что проблема с именами узлов связана с сообщениями об ошибках. Я предполагаю, что вы привели неправильные аргументы при загрузке файла графика или ваш сгенерированный файл графика что-то не так?

Отметьте эту часть:

E/AndroidRuntime(16821): java.lang.IllegalArgumentException: Incompatible 
shapes: [1,224,224,3] vs. [32,1,1,2048]

ОБНОВЛЕНИЕ: Извините, если вы используете (пере) обученный граф, попробуйте следующее:

[n.name + '=>' +  n.op for n in gf.node if n.op in ( 'Softmax','Mul')]

Кажется, что (пере) обученный граф сохраняет имена операций ввода / вывода как «Mul» и «Softmax», в то время как оптимизированный и / или квантованный граф сохраняет их как «Placeholder» и «Softmax».

Кстати, использование переобученного графа в мобильной среде не рекомендуется, согласно сообщению Питера Уордена: https://petewarden.com/2016/09/27/tensorflow-for-mobile-poets/. Лучше использовать квантованный или запомненный граф из-за проблем с производительностью и размером файла, хотя я не мог понять, как загрузить запомненный граф в android ... :( (нет проблем с загрузкой оптимизированного / квантованного графа в android)

person JP Kim    schedule 21.04.2017
comment
Когда я выполняю комментарий для своей пользовательской модели: [n.name + '= ›' + n.op for n in input_graph_def.node if n.op in ('Softmax', 'Placeholder')], я получаю [u ' tower_0 / logits / predictions = ›Softmax '], имя выходного слоя отображается, в то время как имя входного слоя отсутствует. Я не могу понять, где что-то пошло не так. - person Santle Camilus; 24.04.2017
comment
@ Dr.SantleCamilus, я думаю, что причина, по которой вы получаете ошибку при загрузке файла графика, заключается в том, что вы пытались загрузить график, не оптимизированный для мобильных устройств. Вы не должны использовать pb-файл из повторно обученного вывода. На мобильном телефоне есть проблема с Djpeg. Так что просто преобразуйте его, используя optimized_for_inference и / или quantize_graph. Оба хороши, но квантованный график лучше. - person JP Kim; 25.04.2017
comment
вывод [n.name + '= ›' + n.op для n в gf.node, если n.op in ('Softmax', 'Placeholder')] после операции optimized_for_inference, quantize_graph или transform_graph составляет [u'tower_0 / logits / predictions = ›Softmax ']. - person Santle Camilus; 25.04.2017
comment
вывод [n.name + '= ›' + n.op для n в gf.node, если n.op in ('Softmax', 'Mul')] после optimized_for_inference или quantize_graph [u'tower_0 / conv0 / BatchNorm / moment / normalize / shift_mean = ›Mul ', u'tower_0 / conv0 / BatchNorm / moment / normalize / Mul =› Mul', ........... u'tower_0 / mixed_8x8x2048b / branch_pool / Conv / BatchNorm / batchnorm / mul = ›Mul ', u'tower_0 / mixed_8x8x2048b / branch_pool / Conv / BatchNorm / batchnorm / mul_1 =› Mul', u'tower_0 / logits / dropout / dropout / random_uniform / mul = ›Mul ', u'tower_0 / logits / dropout / dropout / mul = ›Mul ', u'tower_0 / logits / predictions =› Softmax'] - person Santle Camilus; 25.04.2017
comment
История идет здесь: модели тензорного потока создаются с использованием начальной архитектуры V3 .: github.com / tensorflow / models / tree / master / inception Модели сохраняются в формате контрольной точки (ckpt) (.meta, .index и .data). Модель преобразуется в файл .pb для переноса в демонстрацию камеры тензорного потока (github.com/tensorflow/tensorflow/blob/master/tensorflow/) - person Santle Camilus; 25.04.2017
comment
Хм .. странно. Не могли бы вы дважды проверить, выполняли ли вы следующие процессы? : 1) созданные файлы контрольных точек с использованием обучения imagenet 2) заморозить их в protobuf (.pb) с помощью freeze_graph 3) оптимизировать замороженный граф с помощью optimize_for_inference (для этого требуется имя узла ввода / вывода, попробуйте Mul & final_result - вы можете использовать файл pb в android отсюда) 4) необязательно: квантовать оптимизированный граф с помощью quantize_graph - person JP Kim; 26.04.2017
comment
да. Я следую тем же процессам. Я поднял вопрос на соответствующем форуме github: github.com/tensorflow/models/issues/1420 Более подробная информация представлена ​​в нем. - person Santle Camilus; 27.04.2017
comment
@ Dr.SantleCamilus, пожалуйста, обратитесь сюда: stackoverflow.com/a/43662693/4571192 Я думаю, это может вам помочь. - person JP Kim; 03.05.2017
comment
Я получаю такой результат * [u'image_tensor = ›Placeholder '] * - person Uma Achanta; 28.08.2017

Недавно я наткнулся на эту опцию прямо из tensorflow:

bazel build tensorflow/tools/graph_transforms:summarize_graph    
bazel-bin/tensorflow/tools/graph_transforms/summarize_graph
--in_graph=custom_graph_name.pb
person Santle Camilus    schedule 30.04.2018

Я написал простой скрипт для анализа отношений зависимостей в вычислительном графе (обычно это DAG, непосредственно ациклический граф). Столь очевидно, что входы - это узлы, у которых нет входа. Однако выходы могут быть определены как любые узлы в графе, потому что в самом странном, но все же допустимом случае выходы могут быть входами, а все остальные узлы - фиктивными. Я по-прежнему определяю операции вывода как узлы без вывода в коде. Вы можете пренебречь этим по своему желанию.

import tensorflow as tf

def load_graph(frozen_graph_filename):
    with tf.io.gfile.GFile(frozen_graph_filename, "rb") as f:
        graph_def = tf.compat.v1.GraphDef()
        graph_def.ParseFromString(f.read())
    with tf.Graph().as_default() as graph:
        tf.import_graph_def(graph_def)
    return graph

def analyze_inputs_outputs(graph):
    ops = graph.get_operations()
    outputs_set = set(ops)
    inputs = []
    for op in ops:
        if len(op.inputs) == 0 and op.type != 'Const':
            inputs.append(op)
        else:
            for input_tensor in op.inputs:
                if input_tensor.op in outputs_set:
                    outputs_set.remove(input_tensor.op)
    outputs = list(outputs_set)
    return (inputs, outputs)
person tigertang    schedule 17.10.2019