¿Cómo se obtiene el nombre de los nodos de salida de tensorflow en un modelo de Keras?

Estoy tratando de crear un archivo pb a partir de mi modelo Keras (backend tensorflow) para poder comstackrlo en iOS. Estoy usando freeze.py y necesito pasar los nodos de salida. ¿Cómo obtengo los nombres de los nodos de salida de mi modelo Keras?

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

Puede usar Keras model.summary () para obtener el nombre de la última capa.

Si model.outputs no está vacío, puede obtener los nombres de los nodos a través de:

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

obtienes la sesión vía

 session = keras.backend.get_session() 

y conviertes todas las variables de entrenamiento a consts via

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

después de eso puedes escribir un archivo protobuf a través de

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

Si los nodos de salida no se especifican explícitamente al construir un modelo en Keras, puede imprimirlos así:

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

Entonces, todo lo que necesita hacer es encontrar el correcto, que a menudo es similar al nombre de la función de activación. Puede usar este nombre de cadena que ha encontrado como un valor para output_node_names en la función freeze_graph .

También puede usar la utilidad tensorflow: summaryize_graph para encontrar posibles output_nodes . De la documentación oficial :

Muchas de las transformaciones que admite la herramienta necesitan saber cuáles son las capas de entrada y salida del modelo. La mejor fuente para estos es el proceso de capacitación modelo, donde para un clasificador las entradas serán los nodos que recibirán los datos del conjunto de capacitación, y la salida serán las predicciones. Si no está seguro, la herramienta Summary_graph puede inspeccionar el modelo y proporcionar conjeturas sobre los posibles nodos de entrada y salida, así como otra información útil para la depuración.

Solo necesita el archivo pb gráfico guardado como entrada. Consulte la documentación para ver un ejemplo.

Los output_node_names deben contener los nombres de los nodos del gráfico que pretende utilizar para la inferencia (por ejemplo, softmax). Se utiliza para extraer el subgrafo que será necesario para la inferencia. Puede ser útil mirar freeze_graph_test .