如何程序化检查TensorFlow SavedModel?批量不可信模型自动化检测问询
当然可以!TensorFlow 2其实提供了不少API来自动化检测SavedModel的这些核心特征,完全不需要依赖TensorBoard手动操作。我来给你一步步拆解实现方法:
一、检测输入输出尺寸与类型
1. 先加载模型并获取签名
SavedModel的输入输出定义都存在**签名(Signature)**里,首先我们需要加载模型并拿到对应的签名(通常默认的服务签名是serving_default):
import tensorflow as tf # 加载SavedModel model = tf.saved_model.load("/path/to/your/saved_model") # 获取默认服务签名(如果有其他签名,替换成对应的名字即可) infer_signature = model.signatures["serving_default"]
2. 提取输入输出的规格信息
通过签名的structured_input_signature和structured_outputs属性,可以直接拿到输入输出的TensorSpec,里面包含了尺寸、数据类型等关键信息:
# 打印输入规格 print("=== 输入特征 ===") for input_name, input_spec in infer_signature.structured_input_signature[1].items(): print(f"名称: {input_name}, 尺寸: {input_spec.shape}, 数据类型: {input_spec.dtype}") # 打印输出规格 print("\n=== 输出特征 ===") for output_name, output_spec in infer_signature.structured_outputs.items(): print(f"名称: {output_name}, 尺寸: {output_spec.shape}, 数据类型: {output_spec.dtype}")
注意:如果输入尺寸里有
None,代表这是动态维度(比如批量大小batch_size),这种情况也能直接从TensorSpec里看出来。
3. (可选)获取实际运行后的输出尺寸
如果需要确认喂入具体输入后的实际输出尺寸,可以构造一个符合规格的示例输入,运行模型后查看:
# 构造示例输入(动态维度可以填具体数值,比如batch_size设为1) sample_inputs = { name: tf.random.normal(spec.shape if spec.shape.rank is not None else (1, *spec.shape[1:])) for name, spec in infer_signature.structured_input_signature[1].items() } # 运行模型 outputs = infer_signature(**sample_inputs) # 打印实际输出尺寸 print("\n=== 实际输出尺寸 ===") for output_name, output_tensor in outputs.items(): print(f"名称: {output_name}, 实际尺寸: {output_tensor.shape}")
二、检测算子类型与执行顺序
要获取模型的算子信息,我们可以通过追踪模型的执行过程,导出计算图然后遍历节点:
# 用tf.function追踪模型执行,生成具体的计算图 @tf.function def run_model(inputs): return infer_signature(**inputs) # 获取包含算子信息的具体函数 concrete_func = run_model.get_concrete_function(sample_inputs) # 遍历计算图中的节点,提取算子信息 print("\n=== 算子类型与执行顺序 ===") for node in concrete_func.graph.as_graph_def().node: # 过滤掉一些无关的内部节点(比如常量、占位符、Identity转换),只保留核心算子 if node.op not in ["Const", "Placeholder", "Identity", "NoOp"]: print(f"算子类型: {node.op}, 节点名称: {node.name}")
这里的节点顺序就是模型执行时的拓扑顺序,完全符合算子的实际运行流程。如果需要更详细的算子属性(比如算子的参数、输入输出张量),可以访问
node.attr和node.input等属性。
额外提示
- 如果你的模型是用Keras保存的SavedModel,也可以直接用
model.input_shape和model.output_shape快速查看输入输出尺寸,但签名的方式更通用,适用于所有类型的SavedModel(比如用tf.Module保存的自定义模型)。 - 如果模型有多个签名(比如同时支持训练和推理),可以通过
model.signatures.keys()列出所有可用签名,然后逐个分析。
内容的提问来源于stack exchange,提问作者lodo
相关产品推荐
相关产品推荐

