Jeśli tensorflow.saved_model.save
zapiszę mój model za pomocą funkcji w formacie SavedModel, jak mogę pobrać, które operacje Tensorflow zostaną użyte w tym modelu później. Ponieważ model można przywrócić, operacje te są przechowywane na wykresie, domyślam się, że w saved_model.pb
pliku. Jeśli załaduję ten protobuf (a więc nie cały model), część protobufa w bibliotece zawiera je, ale nie jest to na razie udokumentowane i oznaczone jako funkcja eksperymentalna. Modele utworzone w Tensorflow 1.x nie będą miały tej części.
Jaki jest zatem szybki i niezawodny sposób na uzyskanie listy używanych operacji (takich jak MatchingFiles
lub WriteFile
) z modelu w formacie SavedModel?
W tej chwili mogę zamrozić wszystko, podobnie jak tensorflowjs-converter
robi. Sprawdzają również obsługiwane operacje. To obecnie nie działa, gdy LSTM jest w modelu, patrz tutaj . Czy istnieje lepszy sposób, aby to zrobić, ponieważ operatorzy zdecydowanie tam są?
Przykładowy model:
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')
Oczekiwano w wyniku wszystkich operacji, zawierających w tym przypadku co najmniej:
ReadFile
jak opisano tutaj- ...
źródło
saved_model.pb
jesttf.GraphDef
, czySavedModel
wiadomość typu protobuf? Jeśli masztf.GraphDef
sprawdzonegd
, możesz uzyskać listę używanych operacji zsorted(set(n.op for n in gd.node))
. Jeśli masz załadowany model, możesz to zrobićsorted(set(op.type for op in tf.get_default_graph().get_operations()))
. Jeśli jest toSavedModel
, możesztf.GraphDef
z niego uzyskać (npsaved_model.meta_graphs[0].graph_def
.).saved_model
zmienna w twoim ostatnim przykładzie? Wyniktf.saved_model.load('/path/to/model')
lub ładowanie protobufa pliku save_model.pb.Odpowiedzi:
Jeśli
saved_model.pb
jest toSavedModel
komunikat Protobuf, operacje są pobierane bezpośrednio z niego. Załóżmy, że tworzymy model w następujący sposób:Możemy teraz znaleźć operacje używane przez ten model w następujący sposób:
źródło
input_scalar = tf.reshape(file_name, []) output = tf.io.read_file(input_scalar) return tf.stack([output], name='content')
W takim razie plik ReadFile Op wymieniony tutaj znajduje się, ale nie jest drukowany.ReadFile
operację na wyjściu. Czy to możliwe, że w twoim przypadku ta operacja nie znajduje się pomiędzy wejściem a wyjściem zapisanego modelu? W takim przypadku myślę, że może zostać przycięty.file_name
argumentu@tf.function
, zawierającą wywołania wymienione w poprzednim komentarzu, daje następującą listę:Const, NoOp, PartitionedCall, Placeholder, StatefulPartitionedCall
saved_model.meta_graphs[0].graph_def.library.function[0]
(node_def
kolekcja w tym obiekcie funkcji).