Si tensorflow.saved_model.save
j'enregistre mon modèle à l'aide de la fonction au format SavedModel, comment puis-je récupérer les Ops Tensorflow utilisées dans ce modèle par la suite. Comme le modèle peut être restauré, ces opérations sont stockées dans le graphique, ma supposition est dans le saved_model.pb
fichier. Si je charge ce protobuf (donc pas le modèle entier), la partie bibliothèque du protobuf les répertorie, mais cela n'est pas documenté et étiqueté comme une fonctionnalité expérimentale pour l'instant. Les modèles créés dans Tensorflow 1.x n'auront pas cette partie.
Alors, quel est un moyen rapide et fiable pour récupérer une liste des opérations utilisées (comme MatchingFiles
ou WriteFile
) à partir d'un modèle au format SavedModel?
En ce moment, je peux geler le tout, comme le tensorflowjs-converter
fait. Comme ils vérifient également les opérations prises en charge. Cela ne fonctionne pas actuellement lorsqu'un LSTM est dans le modèle, voir ici . Y a-t-il une meilleure façon de le faire, car les opérations sont définitivement là-dedans?
Un exemple de modèle:
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')
Attendu en sortie tous les Ops, contenant dans ce cas au moins:
ReadFile
comme décrit ici- ...
la source
saved_model.pb
, est - il untf.GraphDef
ou unSavedModel
message protobuf? Si vous avez untf.GraphDef
appelégd
, vous pouvez obtenir la liste des opérations utilisées avecsorted(set(n.op for n in gd.node))
. Si vous avez un modèle chargé, vous pouvez le fairesorted(set(op.type for op in tf.get_default_graph().get_operations()))
. Si c'est unSavedModel
, vous pouvez l'obtenirtf.GraphDef
(par exemplesaved_model.meta_graphs[0].graph_def
).saved_model
variable dans votre dernier exemple? Résultattf.saved_model.load('/path/to/model')
ou chargement du protobuf du fichier saved_model.pb.Réponses:
S'il
saved_model.pb
s'agit d'unSavedModel
message protobuf, vous obtenez les opérations directement à partir de là. Disons que nous créons un modèle comme suit:Nous pouvons maintenant trouver les opérations utilisées par ce modèle comme ceci:
la source
input_scalar = tf.reshape(file_name, []) output = tf.io.read_file(input_scalar) return tf.stack([output], name='content')
Ensuite, le ReadFile Op tel qu'indiqué ici est là, mais n'est pas imprimé.ReadFile
opération dans la sortie. Est-il possible que, dans votre cas réel, cette opération ne soit pas entre l'entrée et la sortie du modèle enregistré? Dans ce cas, je pense qu'il pourrait être élagué.file_name
argument@tf.function
, contenant les appels que j'ai énumérés dans mon commentaire précédent, il donne la liste suivante:Const, NoOp, PartitionedCall, Placeholder, StatefulPartitionedCall
saved_model.meta_graphs[0].graph_def.library.function[0]
(lanode_def
collection dans cet objet fonction).