Wenn ich mein Modell mit der tensorflow.saved_model.save
Funktion im SavedModel-Format speichere, wie kann ich anschließend abrufen, welche Tensorflow-Operationen in diesem Modell verwendet werden? Da das Modell wiederhergestellt werden kann, werden diese Vorgänge im Diagramm gespeichert. Meine Vermutung liegt in der saved_model.pb
Datei. Wenn ich diesen Protobuf lade (also nicht das gesamte Modell), listet der Bibliotheksteil des Protobuf diese auf, aber dies ist vorerst nicht dokumentiert und als experimentelle Funktion gekennzeichnet. In Tensorflow 1.x erstellte Modelle haben diesen Teil nicht.
Was ist also eine schnelle und zuverlässige Methode, um eine Liste der verwendeten Operationen (Like MatchingFiles
oder WriteFile
) von einem Modell im SavedModel-Format abzurufen?
Im Moment kann ich das Ganze einfrieren, so wie es tensorflowjs-converter
tut. Da sie auch nach unterstützten Operationen suchen. Dies funktioniert derzeit nicht, wenn sich ein LSTM im Modell befindet (siehe hier) . Gibt es einen besseren Weg, dies zu tun, da die Ops definitiv da sind?
Ein Beispielmodell:
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')
Erwartet in der Ausgabe alle Operationen, die in diesem Fall mindestens Folgendes enthalten:
ReadFile
wie hier beschrieben- ...
quelle
saved_model.pb
, ist es einetf.GraphDef
oder eineSavedModel
Protobuf-Nachricht? Wenn Sietf.GraphDef
angerufen habengd
, können Sie die Liste der verwendeten Operationen mit abrufensorted(set(n.op for n in gd.node))
. Wenn Sie ein geladenes Modell haben, können Sie dies tunsorted(set(op.type for op in tf.get_default_graph().get_operations()))
. Wenn es ein istSavedModel
, können Sie dastf.GraphDef
davon bekommen (zBsaved_model.meta_graphs[0].graph_def
).saved_model
Variable in Ihrem letzten Beispiel? Das Ergebnistf.saved_model.load('/path/to/model')
oder Laden des Protobufs der Datei saved_model.pb.Antworten:
Wenn
saved_model.pb
es sich um eineSavedModel
Protobuf-Nachricht handelt, erhalten Sie die Operationen direkt von dort. Angenommen, wir erstellen ein Modell wie folgt:Wir können nun die von diesem Modell verwendeten Operationen wie folgt finden:
quelle
input_scalar = tf.reshape(file_name, []) output = tf.io.read_file(input_scalar) return tf.stack([output], name='content')
meinen Erwartungen : Angenommen, ich habe ein Modell, das dies tut: Dann ist das hier aufgeführte ReadFile Op dort, wird aber nicht gedruckt.ReadFile
Operation in der Ausgabe. Ist es möglich, dass in Ihrem tatsächlichen Fall diese Operation nicht zwischen der Eingabe und der Ausgabe des gespeicherten Modells liegt? In diesem Fall denke ich, dass es beschnitten werden könnte.file_name
Argumentanmerkung erstelle@tf.function
, die die Aufrufe enthält, die ich in meinem vorherigen Kommentar aufgeführt habe, wird die folgende ListeConst, NoOp, PartitionedCall, Placeholder, StatefulPartitionedCall
saved_model.meta_graphs[0].graph_def.library.function[0]
(dernode_def
Sammlung innerhalb dieses Funktionsobjekts).