Как вы получаете имя узлов вывода тензорного потока в модели Keras?

Я пытаюсь создать файл pb из моей модели Keras (shadoworflow backend), чтобы я мог ее создать на iOS. Я использую freeze.py, и мне нужно передать выходные узлы. Как получить имена выходных узлов моей модели Keras?

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/tools/freeze_graph.py

Ответ 1

Вы можете использовать Keras model.summary(), чтобы получить имя последнего слоя.

Если model.outputs не пуст, вы можете получить имена node с помощью:

[node.op.name for node in model.outputs]

вы получаете сеанс через

session = keras.backend.get_session()

и вы преобразовываете все обучающие переменные в consts через

min_graph = convert_variables_to_constants(session, session.graph_def, [node.op.name for node in model.outputs])

после этого вы можете написать protobuf файл через

tensorflow.train.write_graph(min_graph, "/logdir/", "file.pb", as_text=True)

Ответ 2

Если выходные узлы не заданы явно при построении модели в Keras, вы можете распечатать их следующим образом:

[print(n.name) for n in tf.get_default_graph().as_graph_def().node]

Затем все, что вам нужно сделать, это найти правильный, который часто похож на имя функции активации. Вы можете просто использовать это имя строки, которое вы нашли как значение для output_node_names в freeze_graph.

Ответ 3

Вы также можете использовать утилиту tensorflow: summarize_graph найти возможные output_nodes. Из официальной документации:

Многие из преобразований, которые поддерживает инструмент, должны знать, каковы входной и выходной слои модели. Лучшим источником для этого является процесс обучения модели, где для классификатора входными данными будут узлы, которые получают данные из обучающего набора, а выходными данными будут прогнозы. Если вы не уверены, инструмент sumrize_graph может проверить модель и дать предположения о вероятных узлах ввода и вывода, а также другую информацию, полезную для отладки.

Ему просто нужен сохраненный файл pb графа в качестве входных данных. Проверьте документацию для примера.

Ответ 4

output_node_names должен содержать имена узлов графа, которые вы собираетесь использовать для вывода (например, softmax). Он используется для извлечения подграфа, который потребуется для вывода. Может быть полезно посмотреть freeze_graph_test.

Ответ 5

Что касается одного из ответов, где общее число output_nodes = [node.op.name для узла в model.outputs], есть один вопрос, ответ на который я не могу понять. Из всех узлов, какой из узлов должен быть выбран в качестве конечных узлов или выходных узлов. Я анализировал узлы для модели YOLOV3, когда я печатаю вывод узлов из замороженного файла, вывод содержит много узлов. Я не могу понять, какие узлы выбрать в качестве выходных узлов.