【发布时间】:2020-02-10 16:37:10
【问题描述】:
如果我使用 tensorflow.saved_model.save 函数以 SavedModel 格式保存我的模型,之后我如何检索该模型中使用了哪些 Tensorflow Ops。由于模型可以恢复,这些操作都存储在图中,我猜是在saved_model.pb文件中。如果我加载这个 protobuf(所以不是整个模型),protobuf 的库部分会列出这些,但目前没有记录并标记为实验性功能。在 TensorFlow 1.x 中创建的模型没有这部分。
那么,从 SavedModel 格式的模型中检索已使用操作列表(如 MatchingFiles 或 WriteFile)的快速可靠方法是什么?
现在我可以像tensorflowjs-converter 一样冻结整个事情。因为他们还检查支持的操作。当模型中有 LSTM 时,这目前不起作用,请参阅 here。有没有更好的方法来做到这一点,因为 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如here 所述 - ...
【问题讨论】:
-
很难准确说出你想要什么,
saved_model.pb是什么,是tf.GraphDef,还是SavedModelprotobuf 消息?如果您有一个名为gd的tf.GraphDef,您可以使用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)。 -
我想从存储的 SavedModel 中检索操作。确实,您描述的最后一个选项。您上一个示例中的
saved_model变量是什么?tf.saved_model.load('/path/to/model')的结果或者加载了 saved_model.pb 文件的 protobuf。
标签: python tensorflow