Tensorflow 2.1/Keras-"output_node不在图中"尝试冻结图形时出现错误 [英] Tensorflow 2.1/Keras - "output_node is not in graph" error when trying to freeze graph

查看:359
本文介绍了Tensorflow 2.1/Keras-"output_node不在图中"尝试冻结图形时出现错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试保存使用Keras创建并保存为.h5文件的模型,但是每次尝试运行Frozen_session函数时都会收到此错误消息: output_node/Identity不在图中

I'm trying to save a model I created using Keras and saved as .h5 file but I get this Error Message everytime I try to run the freeze_session function: output_node/Identity is not in graph

这是我的代码(我正在使用Tensorflow 2.1.0):

This is my code (I'm using Tensorflow 2.1.0):

def freeze_session(session, keep_var_names=None, output_names=None, clear_devices=True):
    """
    Freezes the state of a session into a pruned computation graph.

    Creates a new computation graph where variable nodes are replaced by
    constants taking their current value in the session. The new graph will be
    pruned so subgraphs that are not necessary to compute the requested
    outputs are removed.
    @param session The TensorFlow session to be frozen.
    @param keep_var_names A list of variable names that should not be frozen,
                          or None to freeze all the variables in the graph.
    @param output_names Names of the relevant graph outputs.
    @param clear_devices Remove the device directives from the graph for better portability.
    @return The frozen graph definition.
    """
    graph = session.graph
    with graph.as_default():
        freeze_var_names = list(set(v.op.name for v in tf.compat.v1.global_variables()).difference(keep_var_names or []))
        output_names = output_names or []
        output_names += [v.op.name for v in tf.compat.v1.global_variables()]
        input_graph_def = graph.as_graph_def()
        if clear_devices:
            for node in input_graph_def.node:
                node.device = ""
        frozen_graph = tf.compat.v1.graph_util.convert_variables_to_constants(
            session, input_graph_def, output_names, freeze_var_names)
        return frozen_graph

model=kr.models.load_model("model.h5")
model.summary()
# inputs:
print('inputs: ', model.input.op.name)
# outputs: 
print('outputs: ', model.output.op.name)
#layers:
layer_names=[layer.name for layer in model.layers]
print(layer_names)

哪些印刷品:

inputs: input_node outputs: output_node/Identity ['input_node', 'conv2d_6', 'max_pooling2d_6', 'conv2d_7', 'max_pooling2d_7', 'conv2d_8', 'max_pooling2d_8', 'flatten_2', 'dense_4', 'dense_5', 'output_node'] 符合预期(与我训练后保存的模型中的层名称和输出相同).

inputs: input_node outputs: output_node/Identity ['input_node', 'conv2d_6', 'max_pooling2d_6', 'conv2d_7', 'max_pooling2d_7', 'conv2d_8', 'max_pooling2d_8', 'flatten_2', 'dense_4', 'dense_5', 'output_node'] as expected (same layer names and outputs as in the model I saved after training it).

然后我尝试调用freeze_session函数并保存生成的冻结图:

Then I try call the freeze_session function and save the resulting frozen graph:

frozen_graph = freeze_session(K.get_session(), output_names=[out.op.name for out in model.outputs])
write_graph(frozen_graph, './', 'graph.pbtxt', as_text=True)
write_graph(frozen_graph, './', 'graph.pb', as_text=False)

但我收到此错误:

AssertionError                            Traceback (most recent call last)
<ipython-input-4-1848000e99b7> in <module>
----> 1 frozen_graph = freeze_session(K.get_session(), output_names=[out.op.name for out in model.outputs])
      2 write_graph(frozen_graph, './', 'graph.pbtxt', as_text=True)
      3 write_graph(frozen_graph, './', 'graph.pb', as_text=False)

<ipython-input-2-3214992381a9> in freeze_session(session, keep_var_names, output_names, clear_devices)
     24                 node.device = ""
     25         frozen_graph = tf.compat.v1.graph_util.convert_variables_to_constants(
---> 26             session, input_graph_def, output_names, freeze_var_names)
     27         return frozen_graph

c:\users\marco\anaconda3\envs\tfv2\lib\site-packages\tensorflow_core\python\util\deprecation.py in new_func(*args, **kwargs)
    322               'in a future version' if date is None else ('after %s' % date),
    323               instructions)
--> 324       return func(*args, **kwargs)
    325     return tf_decorator.make_decorator(
    326         func, new_func, 'deprecated',

c:\users\marco\anaconda3\envs\tfv2\lib\site-packages\tensorflow_core\python\framework\graph_util_impl.py in convert_variables_to_constants(sess, input_graph_def, output_node_names, variable_names_whitelist, variable_names_blacklist)
    275   # This graph only includes the nodes needed to evaluate the output nodes, and
    276   # removes unneeded nodes like those involved in saving and assignment.
--> 277   inference_graph = extract_sub_graph(input_graph_def, output_node_names)
    278 
    279   # Identify the ops in the graph.

c:\users\marco\anaconda3\envs\tfv2\lib\site-packages\tensorflow_core\python\util\deprecation.py in new_func(*args, **kwargs)
    322               'in a future version' if date is None else ('after %s' % date),
    323               instructions)
--> 324       return func(*args, **kwargs)
    325     return tf_decorator.make_decorator(
    326         func, new_func, 'deprecated',

c:\users\marco\anaconda3\envs\tfv2\lib\site-packages\tensorflow_core\python\framework\graph_util_impl.py in extract_sub_graph(graph_def, dest_nodes)
    195   name_to_input_name, name_to_node, name_to_seq_num = _extract_graph_summary(
    196       graph_def)
--> 197   _assert_nodes_are_present(name_to_node, dest_nodes)
    198 
    199   nodes_to_keep = _bfs_for_reachable_nodes(dest_nodes, name_to_input_name)

c:\users\marco\anaconda3\envs\tfv2\lib\site-packages\tensorflow_core\python\framework\graph_util_impl.py in _assert_nodes_are_present(name_to_node, nodes)
    150   """Assert that nodes are present in the graph."""
    151   for d in nodes:
--> 152     assert d in name_to_node, "%s is not in graph" % d
    153 
    154 

**AssertionError: output_node/Identity is not in graph** 

我已经尝试过,但是我真的不知道如何解决这个问题,因此我们将不胜感激.

I've tried but I don't really know how to fix this, so any help would be much appreciated.

推荐答案

如果使用Tensorflow版本2.x,请添加:

If you use Tensorflow version 2.x add:

tf.compat.v1.disable_eager_execution()

这应该有效. 我没有检查生成的pb文件,但它应该可以工作.

This should work. I have not checked the resulting pb file, but it should work.

感谢反馈.

编辑:但是,例如此线程,TF1和TF2 pb文件根本不同.我的解决方案可能无法正常运行,或者实际上无法创建TF1 pb文件.

edit: However, following e.g, this thread, the TF1 and TF2 pb files are fundamentally different. My solution might not work properly or actually create an TF1 pb file.

如果您随后遇到

RuntimeError:尝试使用封闭的会话.

RuntimeError: Attempted to use a closed Session.

这可以通过重新启动内核来解决.使用上面的线,您只有一张照片.

This can be solved by restarting the kernel. You have only one shot using the line above.

这篇关于Tensorflow 2.1/Keras-"output_node不在图中"尝试冻结图形时出现错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆