Come esportare Keras .h5 in tensorflow .pb?

Ho messo a punto il modello iniziale con un nuovo set di dati e l’ho salvato come modello “.h5” in Keras. ora il mio objective è di eseguire il mio modello su Android Tensorflow che accetta solo l’estensione “.pb”. domanda è che c’è qualche libreria in Keras o in tensorflow per fare questa conversione? Ho visto questo post finora: https://blog.keras.io/keras-as-a-simplified-interface-to-tensorflow-tutorial.html ma non riesco ancora a capire.

Keras non include da solo alcun mezzo per esportare un grafico TensorFlow come un file buffer di protocollo, ma è ansible farlo utilizzando le normali utility TensorFlow. Ecco un post sul blog che spiega come farlo usando lo script di utilità freeze_graph.py incluso in TensorFlow, che è il modo “tipico” di farlo.

Tuttavia, personalmente trovo fastidioso dover creare un checkpoint e quindi eseguire uno script esterno per ottenere un modello, e preferisco invece farlo dal mio codice Python, quindi uso una funzione come questa:

 def freeze_session(session, keep_var_names=None, output_names=None, clear_devices=True): """ Freezes the state of a session into a pruned computation graph. Creates a new computation graph where variable nodes are replaced by constants taking their current value in the session. The new graph will be pruned so subgraphs that are not necessary to compute the requested outputs are removed. @param session The TensorFlow session to be frozen. @param keep_var_names A list of variable names that should not be frozen, or None to freeze all the variables in the graph. @param output_names Names of the relevant graph outputs. @param clear_devices Remove the device directives from the graph for better portability. @return The frozen graph definition. """ from tensorflow.python.framework.graph_util import convert_variables_to_constants graph = session.graph with graph.as_default(): freeze_var_names = list(set(v.op.name for v in tf.global_variables()).difference(keep_var_names or [])) output_names = output_names or [] output_names += [v.op.name for v in tf.global_variables()] input_graph_def = graph.as_graph_def() if clear_devices: for node in input_graph_def.node: node.device = "" frozen_graph = convert_variables_to_constants(session, input_graph_def, output_names, freeze_var_names) return frozen_graph 

Che è ispirato all’implementazione di freeze_graph.py . Anche i parametri sono simili allo script. session è l’object della sessione TensorFlow. keep_var_names è necessario solo se si desidera mantenere alcune variabili non congelate (ad esempio per i modelli con stato), quindi in genere no. output_names è una lista con i nomi delle operazioni che producono gli output che si desidera. clear_devices rimuove solo le direttive del dispositivo per rendere il grafico più portabile. Quindi, per un tipico model Keras con un output, dovresti fare qualcosa come:

 from keras import backend as K # Create, compile and train model... frozen_graph = freeze_session(K.get_session(), output_names=[out.op.name for out in model.outputs]) 

Quindi puoi scrivere il grafico su un file come al solito con tf.train.write_graph :

 tf.train.write_graph(frozen_graph, "some_directory", "my_model.pb", as_text=False) 

Il metodo freeze_session funziona correttamente. Ma rispetto al salvataggio in un file di checkpoint, utilizzare lo strumento freeze_graph fornito con TensorFlow mi sembra più semplice, in quanto è più semplice da mantenere. Tutto quello che devi fare è i seguenti due passi:

Innanzitutto, aggiungi dopo il tuo codice Keras model.fit(...) e allena il tuo modello:

 from keras import backend as K import tensorflow as tf print(model.output.op.name) saver = tf.train.Saver() saver.save(K.get_session(), '/tmp/keras_model.ckpt') 

Quindi, fai cd nella directory root di TensorFlow, esegui:

 python tensorflow/python/tools/freeze_graph.py \ --input_meta_graph=/tmp/keras_model.ckpt.meta \ --input_checkpoint=/tmp/keras_model.ckpt \ --output_graph=/tmp/keras_frozen.pb \ --output_node_names="" \ --input_binary=true