如何检测TensorFlow SavedModel的通道优先/通道后数据格式?
检测TensorFlow SavedModel数据格式的可行方案
原生SavedModel本质是序列化的计算图和权重集合,没有Keras模型那样内置的全局层元数据,所以不存在和Keras完全等价的直接读取data_format的方法,你可以用以下两种方案判断:
方案1:模型从Keras导出的场景
- 优先直接用Keras接口加载:
keras_model = tf.keras.models.load_model(path),之后就可以遍历model.layers,通过层属性l.data_format判断格式,绝大多数Keras导出的SavedModel都支持该方式读取元数据。 - 如果已经用
tf.saved_model.load加载完成,也可以直接读取推理签名的输入形状判断:
常规4维图像输入的场景下:loaded_model = tf.saved_model.load(path) infer_signature = loaded_model.signatures["serving_default"] # 打印输入张量的形状信息 print(infer_signature.inputs[0].shape)- 形状为
(batch_size, height, width, channels)对应channels_last(通道后) - 形状为
(batch_size, channels, height, width)对应channels_first(通道优先)
- 形状为
方案2:非Keras导出的原生SavedModel场景
直接遍历计算图节点读取卷积算子的data_format属性,该方法准确率最高,不需要依赖Keras层元数据:
loaded_model = tf.saved_model.load(path) graph_def = loaded_model.signatures['serving_default'].graph.as_graph_def() for node in graph_def.node: # 匹配2D卷积算子,也可以根据需要加Conv3D等其他算子判断 if node.op == 'Conv2D': data_format = node.attr['data_format'].s.decode() print(f"模型数据格式为:{data_format}") break
注意:如果模型没有卷积算子,或者是动态输入维度的非视觉类任务,形状判断法可能失效,需要结合实际业务的输入输出约定确认格式。
内容的提问来源于stack exchange,提问作者Artyom
相关产品推荐
相关产品推荐

