Как вы получаете имя узлов вывода тензорного потока в модели 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, когда я печатаю вывод узлов из замороженного файла, вывод содержит много узлов. Я не могу понять, какие узлы выбрать в качестве выходных узлов.