将CNN tensorflow模型冻结为.pb文件

时间:2017-08-01 08:53:24

标签: python tensorflow neural-network tensorflow-serving

我目前正在尝试使用CNN进行超分辨率。为了服务我的模型,我需要先将它释放到.pb文件中,对吗? 作为一个新手,我真的不知道该怎么做。 我的模型基本上是这样的:

低分辨率输入图像 - >双三次缩放(2x) - >喂给CNN - > CNN输出图像具有相同(2x)分辨率。

我的模型有3个简单的图层。输出层被称为"输出"。你可以在这里找到模型:

https://github.com/pinae/Superresolution

它保存了它的进度:

  • 检查点
  • network_params.data-00000-的-00001
  • network_params.index
  • network_params.meta

我知道如何做到这一点。

首先:遵循本教程:https://blog.metaflow.fr/tensorflow-how-to-freeze-a-model-and-serve-it-with-a-python-api-d4f3596b3adc

这似乎是针对多个输出节点(用于识别)而不是针对仅具有一个输出的超分辨率。我不知道如何修改该脚本以供我使用。

第二:使用freeze_graph.py

同样,我完全迷失了如何在我的模型中使用它。所有示例似乎都基于MNIST教程。

谢谢!

1 个答案:

答案 0 :(得分:0)

不明白你的意思但是在metaflow文章中,他也使用了一个输出节点。您可以添加多个,具体取决于您对tensor

的命名方式

在您的情况下,请查看network.py。您需要查看output_layer

    self.output = self.conv_layer("reconstruction_layer", self.layer_params[-1],
                                  non_linear_mapping_layer, linear=True)

正如您所看到的那样,由于conv_layer已经存在名称,因此在元流代码中,您需要执行以下操作:

def freeze_graph(model_folder):
    # We retrieve our checkpoint fullpath
    checkpoint = tf.train.get_checkpoint_state(model_folder)
    input_checkpoint = checkpoint.model_checkpoint_path

    # We precise the file fullname of our freezed graph
    absolute_model_folder = "/".join(input_checkpoint.split('/')[:-1])
    output_graph = absolute_model_folder + "/frozen_model.pb"

    # Before exporting our graph, we need to precise what is our output node
    # This is how TF decides what part of the Graph he has to keep and what part it can dump
    # NOTE: this variable is plural, because you can have multiple output nodes
    output_node_names = "reconstruction_layer"
    ...

注意:有时它在命名中有一个前缀,就像元数据文章Accuracy/predictions的情况下,Accuracy是一个前缀。因此,打印出存储在检查点中的所有变量名称是有意义的。

顺便说一句,从TF 1.0开始,您可以使用SavedModelBuilder保存模型。这是首选方式,因为它提供了跨多种语言的兼容性。唯一需要注意的是,它仍然不是单个文件,但与Tensorflow服务配合良好。