Si tensorflow.saved_model.save
guardo mi modelo usando la función en formato Guardado, ¿cómo puedo recuperar qué Tensorflow Ops se utilizan en este modelo después? Como el modelo se puede restaurar, estas operaciones se almacenan en el gráfico, supongo que está en el saved_model.pb
archivo. Si cargo este protobuf (por lo tanto, no todo el modelo), la parte de la biblioteca del protobuf enumera estos, pero esto no está documentado y etiquetado como una característica experimental por ahora. Los modelos creados en Tensorflow 1.x no tendrán esta parte.
Entonces, ¿cuál es una forma rápida y confiable de recuperar una lista de Operaciones usadas (Me gusta MatchingFiles
o WriteFile
) de un modelo en formato GuardadoModelo?
Ahora mismo puedo congelar todo, como lo tensorflowjs-converter
hace. Como también verifican las operaciones compatibles. Actualmente, esto no funciona cuando hay un LSTM en el modelo, vea aquí . ¿Hay una mejor manera de hacer esto, ya que los Ops definitivamente están ahí?
Un modelo de ejemplo:
class FileReader(tf.Module):
@tf.function(input_signature=[tf.TensorSpec(name='filename', shape=[None], dtype=tf.string)])
def read_disk(self, file_name):
input_scalar = tf.reshape(file_name, [])
output = tf.io.read_file(input_scalar)
return tf.stack([output], name='content')
file_reader = FileReader()
tf.saved_model.save(file_reader, 'file_reader')
Se espera en la salida todas las operaciones, que contienen en este caso al menos:
ReadFile
como se describe aquí- ...
fuente
saved_model.pb
, ¿estf.GraphDef
unSavedModel
mensaje de protobuf? Si tiene unatf.GraphDef
llamadagd
, puede obtener la lista de operaciones usadas consorted(set(n.op for n in gd.node))
. Si tiene un modelo cargado, puede hacerlosorted(set(op.type for op in tf.get_default_graph().get_operations()))
. Si es unSavedModel
, puede obtenerlotf.GraphDef
(psaved_model.meta_graphs[0].graph_def
. Ej .).saved_model
variable en tu último ejemplo? El resultado detf.saved_model.load('/path/to/model')
o cargando el protobuf del archivo saved_model.pb.Respuestas:
Si
saved_model.pb
es unSavedModel
mensaje protobuf, entonces obtiene las operaciones directamente desde allí. Digamos que creamos un modelo de la siguiente manera:Ahora podemos encontrar las operaciones utilizadas por ese modelo así:
fuente
input_scalar = tf.reshape(file_name, []) output = tf.io.read_file(input_scalar) return tf.stack([output], name='content')
Entonces, el ReadFile Op como se muestra aquí está allí, pero no está impreso.ReadFile
operación en la salida. ¿Es posible que, en su caso real, esa operación no esté entre la entrada y la salida del modelo guardado? En ese caso, creo que podría podarse.file_name
argumento@tf.function
, que contiene las llamadas que enumeré en mi comentario anterior, da la siguiente lista:Const, NoOp, PartitionedCall, Placeholder, StatefulPartitionedCall
saved_model.meta_graphs[0].graph_def.library.function[0]
(lanode_def
colección dentro de ese objeto de función).