Если я tensorflow.saved_model.save
сохраню свою модель, используя функцию в формате SavedModel, как я могу узнать, какие операции Tensorflow используются в этой модели впоследствии. Поскольку модель может быть восстановлена, эти операции хранятся в графике, я думаю, в saved_model.pb
файле. Если я загружаю этот protobuf (то есть не всю модель), библиотечная часть protobuf перечисляет их, но это пока не задокументировано и не помечено как экспериментальная функция. Модели, созданные в Tensorflow 1.x, не будут иметь этой части.
Итак, что такое быстрый и надежный способ получения списка используемых операций (например, MatchingFiles
или WriteFile
) из модели в формате SavedModel?
Прямо сейчас я могу заморозить всю вещь, как tensorflowjs-converter
делает. Как они также проверяют на поддерживаемые операции. В настоящее время это не работает, когда LSTM находится в модели, см. Здесь . Есть ли лучший способ сделать это, поскольку Ops определенно там?
Пример модели:
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')
Ожидаемые в выводе все Ops, содержащие в этом случае как минимум:
ReadFile
как описано здесь- ...
источник
saved_model.pb
этоtf.GraphDef
, илиSavedModel
сообщение protobuf? Если у вас естьtf.GraphDef
вызовgd
, вы можете получить список используемых операций сsorted(set(n.op for n in gd.node))
. Если у вас есть загруженная модель, вы можете сделатьsorted(set(op.type for op in tf.get_default_graph().get_operations()))
. Если этоSavedModel
, вы можете получитьtf.GraphDef
от него (напримерsaved_model.meta_graphs[0].graph_def
).saved_model
переменная в вашем последнем примере? Результатtf.saved_model.load('/path/to/model')
или загрузка протобуфа файла сохраненного_моделя.pb.Ответы:
Если
saved_model.pb
этоSavedModel
сообщение protobuf, то вы получаете операции непосредственно оттуда. Допустим, мы создаем модель следующим образом:Теперь мы можем найти операции, используемые этой моделью:
источник
input_scalar = tf.reshape(file_name, []) output = tf.io.read_file(input_scalar) return tf.stack([output], name='content')
тогда Op ReadFile, как указано здесь, находится там, но не печатается.ReadFile
операцию на выходе. Возможно ли, что в вашем реальном случае эта операция не находится между входом и выходом сохраненной модели? В этом случае я думаю, что это может быть сокращено.file_name
аргумента@tf.function
, содержащей вызовы, которые я перечислил в моем предыдущем комментарии, он дает следующий список:Const, NoOp, PartitionedCall, Placeholder, StatefulPartitionedCall
saved_model.meta_graphs[0].graph_def.library.function[0]
(node_def
коллекции внутри этого объекта функции).