freeze_inference_graph.pb和saved_model.pb有什么区别

python

1个回答

写回答

Xx811016

2025-06-18 20:20

+ 关注

Python
Python

<强化学习模型的导出格式:freeze_inference_graph.pb与saved_model.pb的区别>

在深度学习领域,模型的导出对于模型的部署和应用至关重要。TensorFlow作为一种流行的深度学习框架,提供了多种模型导出格式,其中包括freeze_inference_graph.pb和saved_model.pb。这两种格式在导出模型时有着不同的用途和特点。

freeze_inference_graph.pb

freeze_inference_graph.pb是一种冻结推理图的导出格式。在TensorFlow中,推理图是指在训练过程中,将模型的计算图中的一部分节点冻结,并去除与训练相关的节点。通过冻结推理图,可以将模型的参数和计算过程打包成一个文件,方便后续的模型部署和推理阶段的使用。

冻结推理图具有以下特点:

- 只包含推理所需的节点和参数,去除了训练相关的节点和参数,减小了模型的体积。

- 推理图中的参数是固定的,无法进行调整或更新。因此,该格式适用于模型的静态部署场景。

saved_model.pb

saved_model.pb是一种保存模型的导出格式。与freeze_inference_graph.pb不同,saved_model.pb保存了完整的计算图和模型参数,同时还包含了模型的元信息和签名信息。通过saved_model.pb,可以实现模型的动态加载、运行时的灵活调整和模型生命周期的管理。

saved_model.pb具有以下特点:

- 保存了完整的计算图和模型参数,可以实现模型的动态加载和调整。

- 包含了模型的元信息和签名信息,方便模型的版本管理和部署。

- 支持TensorFlow Serving等服务框架的直接加载和部署。

在实际应用中,根据具体的需求选择适合的模型导出格式是非常重要的。如果模型已经完成训练过程,仅需要进行推理阶段的部署和应用,可以选择freeze_inference_graph.pb。如果需要模型的动态加载、调整和灵活部署,可以选择saved_model.pb。

案例代码:

Python

import tensorflow as tf

# 导出为freeze_inference_graph.pb

def export_freeze_inference_graph():

# 构建计算图

x = tf.placeholder(tf.float32, shape=[None, 784], name='input')

w = tf.get_variable('weights', shape=[784, 10], initializer=tf.random_normal_initializer())

b = tf.get_variable('biases', shape=[10], initializer=tf.zeros_initializer())

logits = tf.matmul(x, w) + b

output = tf.nn.softmax(logits, name='output')

# 导出模型

graph_def = tf.get_default_graph().as_graph_def()

freeze_graph_def = tf.graph_util.convert_variables_to_constants(

tf.get_default_session(),

graph_def,

output_node_names=['output']

)

with tf.gfile.GFile('freeze_inference_graph.pb', 'wb') as f:

f.write(freeze_graph_def.SerializeToString())

# 导出为saved_model.pb

def export_saved_model():

# 构建计算图

x = tf.placeholder(tf.float32, shape=[None, 784], name='input')

w = tf.get_variable('weights', shape=[784, 10], initializer=tf.random_normal_initializer())

b = tf.get_variable('biases', shape=[10], initializer=tf.zeros_initializer())

logits = tf.matmul(x, w) + b

output = tf.nn.softmax(logits, name='output')

# 导出模型

builder = tf.saved_model.builder.SavedModelBuilder('saved_model')

tensor_info_x = tf.saved_model.utils.build_tensor_info(x)

tensor_info_output = tf.saved_model.utils.build_tensor_info(output)

prediction_signature = (

tf.saved_model.signature_def_utils.build_signature_def(

inputs={'input': tensor_info_x},

outputs={'output': tensor_info_output},

method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME

)

)

with tf.Session() as sess:

builder.add_Meta_graph_and_variables(

sess,

[tf.saved_model.tag_constants.SERVING],

signature_def_map={

tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: prediction_signature

}

)

builder.save()

# 导出freeze_inference_graph.pb

export_freeze_inference_graph()

# 导出saved_model.pb

export_saved_model()

freeze_inference_graph.pb和saved_model.pb是TensorFlow中常用的模型导出格式。freeze_inference_graph.pb适用于静态推理场景,仅包含推理所需的节点和参数;saved_model.pb适用于动态加载和灵活部署场景,保存了完整的计算图和模型参数。根据具体的需求选择适合的模型导出格式,有助于提高模型的部署和应用效率。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号