【问题标题】:Copy Frozen Values From A Frozen Graph to Another Frozen Graph将冻结值从冻结图复制到另一个冻结图
【发布时间】:2020-10-26 08:24:36
【问题描述】:

我有 2 个frozen_graphs,它们被训练并存储为不同的 pb 文件。它们都共享一些相同的节点。如何将节点值从 1 个图形转移到另一个图形?例如,如何复制 FakeQuantWithMinMaxVars 节点来替换下面的节点?

【问题讨论】:

  • 你想合并两个冻结的 .pb 文件吗??
  • 不完全是,我只需要一部分冷冻铅来提高我的准确性。像上面的一些顶层替换为底层模型

标签: python tensorflow keras deep-learning quantization


【解决方案1】:

我通过按图中相似的节点映射节点来解决这个问题。然后通过tf.import_graph_def 连接它并通过graph_transform 删除unused_nodes。对于量化能力,避免使用merge duplicate或fold batch norm,这会因缺少min-max quant而造成量化误差

import tensorflow as tf
import numpy as np

# load graphs using pb file path
def load_graph(pb_file):
    graph = tf.Graph()
    with graph.as_default():
        od_graph_def = tf.GraphDef()
        with tf.gfile.GFile(pb_file, 'rb') as fid:
            serialized_graph = fid.read()
            od_graph_def.ParseFromString(serialized_graph)
            tf.import_graph_def(od_graph_def, name='')
    return graph

resnet_pretrained = 'frozen_124.pb'
trained = 'frozen.pb'

# new file name to save combined model
final_graph = 'final_graph.pb'

# loads both graphs
graph1 = load_graph(resnet_pretrained)
graph2 = load_graph(trained)
replace_dict = {}
# get tensor names from first graph
with graph1.as_default():

    # getting tensors to add crop and resize step
    ops = graph1.get_operations()
    ops1_name = []
    for op in ops:
        # print(op.name)
        ops1_name.append(op.name)
    ops = graph2.get_operations()
    ops2_name = []
    replace_name = []
    for op in ops:
        # print(op.name)
        ops2_name.append(op.name)
        if op.name in ops1_name:
            replace_name = op.name
            replace_dict[str(replace_name)+':0'] = replace_name+':0'
            continue
        if 'resnet' in op.name:
            replace_name = op.name.replace("resnet","model")
            if replace_name in ops1_name:
                replace_dict[str(op.name)+':0'] = replace_name+':0'

with tf.Graph().as_default() as final:
    y = tf.import_graph_def(graph1.as_graph_def(), return_elements=replace_dict.values())
    new=dict()
    for i,j in zip(replace_dict.keys(),y):
        new[i] = j
    z = tf.import_graph_def(graph2.as_graph_def(), input_map=new, return_elements=["concatenate_1/concat:0"])

    # tf.train.write_graph(graph2.as_graph_def(), "./", final_graph, as_text=False)

# for op in final.get_operations():
#     print(op.name)
from tensorflow.tools.graph_transforms import TransformGraph
transforms = ['remove_nodes(op=Identity)',
 'strip_unused_nodes']
output_graph_def = TransformGraph(
        final.as_graph_def(),
        ["import/input_image","import_1/input_box"], ## input
        ["import_1/concatenate_1/concat"], ## outputs
        transforms)
tf.train.write_graph(output_graph_def, '.' , as_text=False, name='optimized_model.pb')
print('Graph optimized!')

【讨论】:

    猜你喜欢
    • 2013-01-16
    • 1970-01-01
    • 2013-11-03
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多