【问题标题】:How to freeze an im2txt model?如何冻结 im2txt 模型?
【发布时间】:2018-02-06 17:14:26
【问题描述】:

我对im2txt模型进行了微调,并使用im2txt github中的程序获得了ckpt.data、ckpt.index和ckpt.meta文件和一个graph.pbtxt文件。 该模型似乎运行良好,因为它产生了几乎正确的字幕。

现在我想冻结这个模型以便在 android 上使用它。

我在https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/tools/freeze_graph.py 中使用了 freeze_graph.py 脚本。

python freeze_graph.py --input_graph=/path/to/graph.pbtxt --input_binary=false --input_checkpoint=/path/to/model.ckpt --output_graph=/path/to/output_graph.pb --output_node_names="softmax,lstm/initial_state,lstm/state"

我有以下错误:AssertionError: softmax is not in graph

https://github.com/tensorflow/models/issues/816 中的讨论是关于同样的问题,但对我没有多大帮助。 确实,当我查看微调后生成的graph.pbtxt时,我找不到softmax、lstm/initial_state和lstm/state。 但是在im2txt的show_and_tell_model.py文件中,张量的名字好像是“softmax”、“lstm/initial_state”和“lstm/state”。所以,我不知道发生了什么。

我希望我对到目前为止所尝试的内容足够清楚。提前感谢您的帮助。

问候, 斯蒂芬

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    找到并验证了答案:在 inference_wrapper.base.py 中,只需在 def _restore_fn(sess): 中的 saver.restore(sess, checkpoint_path) 之后添加类似 saver.save(sess, "model/ckpt4") 的内容。然后重新构建和运行推理,您将获得一个模型,该模型可以被冻结、转换和选择性地进行内存映射,以供 iOS 和 Android 应用程序加载。

    有关冻结、转换和转换为 memmapped 的详细命令,请参阅我在 Error using Model after using optimize_for_inference.py on frozen graph 的回答。

    【讨论】:

    • 嗨,对不起,我的回答不够清楚。很高兴你找到了如何冻结模型。我仍然无法在 Android 上使用我的模型。我使用了您的答案中的命令,并且在使用 TensorflowInferenceInterface 加载模型时出现以下错误:“不是有效的 TensorFlow Graph 序列化:形状必须为 4 级,但对于 'ResizeBilinear'(操作:'ResizeBilinear')为 5 级,带有输入形状:[1,1,299,299,3],[2]。”你知道什么是错的吗?问候,斯蒂芬
    • 你是否使用了生成的转换文件:bazel-bin/tensorflow/tools/graph_transforms/transform_graph \ --in_graph=/tmp/ckpt4_frozen.pb \ --out_graph=/tmp/ckpt4_frozen_transformed.pb \ --inputs="convert_image/Cast,input_feed,lstm/state_feed" \ --outputs="softmax,lstm/initial_state,lstm/state" \ --transforms=' strip_unused_nodes(type=float, shape="1,299,299,3 ") fold_constants(ignore_errors=true) fold_batch_norms fold_old_batch_norms'
    • 是的,我用过这个。也许这是我在转换之前使用的冻结模型的问题?在 Java 代码中,我尝试将“input_feed”和“convert_image/Cast”作为输入节点,但它们都不起作用。是否有特定版本的 tensorflow 可供使用(例如 >1.4)?仍在努力使其发挥作用。无论如何,感谢您花时间回答并尝试提供帮助!
    【解决方案2】:

    好的,

    我想我终于找到了解决方案。如果它对其他人有用,这里是:

    训练完成后,得到ckpt.data、ckpt.index、ckpt.meta文件和graph.pbtxt文件。

    然后您必须在“推理”模式下加载此模型(请参阅 im2txt 中的 InferenceWrapper)。它使用正确的名称“softmax”、“lstm/initial_state”和“lstm/state”构建一个图。您保存此图(使用相同的 ckpt 格式),然后您可以应用 freeze_graph 脚本来获取冻结模型。

    问候, 斯蒂芬

    【讨论】:

    • 我在 inference_wrapper.py 的 inference_step 和 build_model 以及 inference_wrapper_base 的 _restore_fn 中添加了 saver = tf.train.Saver() saver.save(sess, "/tmp/im2txt.ckpt") .py。然后我在python中使用了生成的检查点文件 tensorflow/python/tools/freeze_graph.py --input_graph=graph.pbtxt --input_checkpoint=/tmp/im2txt.ckpt --output_graph=/tmp/im2txt_frozen_graph.pb --output_node_names=" softmax,lstm/initial_state,lstm/state" 但总是得到错误 AssertionError: softmax is not in graph。你能发布你用来解决问题的确切位置、文件和代码吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    相关资源
    最近更新 更多