Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 将冻结的模型(.pb)转换为保存的模型_Tensorflow - Fatal编程技术网

Tensorflow 将冻结的模型(.pb)转换为保存的模型

Tensorflow 将冻结的模型(.pb)转换为保存的模型,tensorflow,Tensorflow,最近,我尝试将模型(tf1.x)转换为保存的_模型,并遵循官方的方法。然而,在我的用例中,我手中的大多数模型或tensorflow model zoo通常是pb文件,根据 没有直接的方法将raw Graph.pb文件升级到TensorFlow 2.0,但如果您有一个“冻结图”(变量已转换为常量的tf.Graph),则可以使用v1.wrap\u函数将其转换为具体的函数: 但我仍然不明白如何在TF1模式下转换为。: 将tensorflow导入为tf 从tensorflow.python.saved_

最近,我尝试将模型(tf1.x)转换为保存的_模型,并遵循官方的方法。然而,在我的用例中,我手中的大多数模型或tensorflow model zoo通常是pb文件,根据

没有直接的方法将raw Graph.pb文件升级到TensorFlow 2.0,但如果您有一个“冻结图”(变量已转换为常量的tf.Graph),则可以使用v1.wrap\u函数将其转换为具体的函数:

但我仍然不明白如何在TF1模式下转换为。

将tensorflow导入为tf
从tensorflow.python.saved_model导入签名_常量
从tensorflow.python.saved_model导入标记_常量
def convert_pb_to_server_model(pb_model_路径、导出目录、输入名称='input:0',输出名称='output:0'):
图形定义=读取pb模型(pb模型路径)
转换已保存的模型(图形定义、导出目录、输入名称、输出名称)
def read_pb_模型(pb_模型路径):
将tf.gfile.gfile(pb_model_path,“rb”)作为f:
graph_def=tf.GraphDef()
graph_def.ParseFromString(f.read())
返回图
def convert_pb_saved_模型(图形_def、导出目录、输入_name='input:0',输出_name='output:0'):
builder=tf.saved\u model.builder.SavedModelBuilder(导出目录)
sigs={}
使用tf.Session(graph=tf.graph())作为sess:
tf.import_graph_def(graph_def,name=”“)
g=tf.get_default_graph()
inp=g.通过名称获取张量(输入名称)
out=g.通过名称获取张量(输出名称)
sigs[signature_constants.DEFAULT_SERVING_signature_DEF_KEY]=\
tf.saved_model.signature_def_utils.predict_signature_def(
{“输入”:inp},{“输出”:out})
添加元图和变量(SES,
[tag_constants.SERVING],
签名_def_map=sigs)
builder.save()
在TF2模式下:

将tensorflow导入为tf
从tensorflow.python.framework.convert_to_constants导入convert_variables_to_constants_v2_as_graph
从tensorflow.lite.python.util导入运行图优化,获取图配置
将numpy作为np导入
def冻结图(func模型):
冻结函数,图定义=将变量转换为常数,将v2转换为图(函数模型)
输入张量=[
冻结函数输入中张量的张量
如果tensor.dtype!=tf.resource
]
输出张量=冻结函数输出
图形定义=运行图形优化(
图形_def,
输入_张量,
输出_张量,
config=get\u grappler\u config([“constfold”,“function”]),
图=冻结函数图)
返回图
def将_keras_model_转换为_pb():
keras_模型=列车_模型()
func_model=tf.function(keras_model).get_concrete_函数(tf.TensorSpec(keras_model.inputs[0].shape,keras_model.inputs[0].dtype))
graph_def=冻结的keras图(函数模型)
tf.io.write_graph(graph_def、/tmp/tf_model3、'freezed_graph.pb')
def将_保存的_模型_转换为_pb():
model_dir='/tmp/saved_model'
model=tf.saved\u model.load(model\u dir)
func_model=model.signatures[“默认服务”]
graph_def=冻结的keras图(函数模型)
tf.io.write_graph(graph_def、/tmp/tf_model3、'freezed_graph.pb')
或:

def将保存的模型转换为pb(输出节点名称、输入保存的模型目录、输出图表目录):
从tensorflow.python.tools导入冻结图
输出节点名称=','。连接(输出节点名称)
冻结图形。冻结图形(输入图形=无,输入图形=无,
输入\二进制=无,
输入检查点=无,
输出节点名称=输出节点名称,
restore_op_name=None,
filename\u tensor\u name=None,
output\u graph=output\u graph\u dir,
清除设备=无,
初始值设定项\节点=无,
输入\保存\模型\目录=输入\保存\模型\目录)
def save_output_tensor_to_pb():
输出\u名称=['StatefulPartitionedCall']
保存模型路径='/tmp/pb\u model/freeze\u graph.pb'
model_dir='/tmp/saved_model'
将\u保存的\u模型\u转换为\u pb(输出\u名称、模型\u目录、保存\u pb\u模型\u路径)

为了确保我的理解是否正确,我还发布了我学到的内容:

如果有人希望将tf1.x迁移到tf2.x,请遵循第一条

在tensorflow 2.0中,tf.train.Saver已被替换为

如果有人想将pb模型从tf1.x转换为保存的_模型,您可以按照@boloyu-answer进行操作。但如果运行时环境高于tf2.0,则可以使用以下代码:

import tensorflow.compat.v1 as tf 
tf.disable_v2_behavior()
from tensorflow.python.saved_model import signature_constants
from tensorflow.python.saved_model import tag_constants

def covert_pb_to_server_model(pb_model_path, export_dir, input_name='input', output_name='output'):
    graph_def = read_pb_model(pb_model_path)
    covert_pb_saved_model(graph_def, export_dir, input_name, output_name)


def read_pb_model(pb_model_path):
    with tf.gfile.GFile(pb_model_path, "rb") as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
        return graph_def


def covert_pb_saved_model(graph_def, export_dir, input_name='input', output_name='output'):
builder = tf.saved_model.builder.SavedModelBuilder(export_dir)

sigs = {}
with tf.Session(graph=tf.Graph()) as sess:
    tf.import_graph_def(graph_def, name="")
    g = tf.get_default_graph()
    inp = g.get_tensor_by_name(input_name)
    out = g.get_tensor_by_name(output_name)

    sigs[signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY] = \
        tf.saved_model.signature_def_utils.predict_signature_def(
            {"input": inp}, {"output": out})

    builder.add_meta_graph_and_variables(sess,
                                         [tag_constants.SERVING],
                                         signature_def_map=sigs)
    builder.save()

请加上补偿。你救了我一天,谢谢!!!对于任何使用tensorflow version>2.0的用户,“将tensorflow作为tf导入”应替换为将tensorflow.compat.v1作为tf导入。禁用\u v2\u行为()如何知道输入和输出名称?@secsilm您可以使用
saved\u model\u cli show--dir
检查.pb信息。
值错误:“input”名称指的是操作,而不是张量。张量名称的格式必须为“:”。
at
inp=g.get\u Tensor\u by\u name(input\u name)