【问题标题】:Nan output when converting pretrained Tensorflow model to Tf-lite将预训练的 Tensorflow 模型转换为 Tf-lite 时的 Nan 输出
【发布时间】:2019-05-22 19:08:27
【问题描述】:

在转换我们将其作为以下文件的预训练 Tensorflow 模型时遇到问题

snapshot_140.ckpt.index

snapshot_140.ckpt.meta

snapshot_140.ckpt.data-00000-of-00001

到张量流精简版 当我们使用转换后的 tflie 文件进行预测时,所有预测都在 Nan 而加载正常的 tensorflow 模型时给出了正确的回归预测

我们在上面得到了这些文件,从 ckpt 文件到 tensorflow .pb 图的转换是通过 tensorflow.python.tools.freeze_graph 工具进行的

然后是TFlite_converter工具,用于转换为tflite

.pb 在制作成 tensorflow 模型时效果很好。但 tflite 模型会产生所有 nan 输出

一个(潜在的解决方案)受此问题启发: https://github.com/tensorflow/tensorflow/issues/22803?fbclid=IwAR0x25CEZjHAQ0dUFBVWa1V3lVcCVIpT4q7lbUUGS9T59w2aXqnUVtNCBHI#issuecomment-474249701

那么如何将 batch_norm is_training 标志设置为 false,只给 ckpt 文件而无法访问模型架构?

如果这真的是问题的解决方案

或者我们应该如何修复 tensorflow lite 模型以提供与 tensorflow 模型相同的输出

此代码用于获取提供 nans 的 tensorflow lite 模型

    import tensorflow as tf
    with tf.Session(config=tf.ConfigProto(allow_soft_placement=True, 
    log_device_placement=True)) as sess:

        saver = tf.train.import_meta_graph('snapshot_140.ckpt.meta')

        saver.restore(sess, "snapshot_140.ckpt")
        inp = tf.get_default_graph().get_tensor_by_name("tower_0/Placeholder:0")
        out = tf.get_default_graph().get_tensor_by_name("tower_0/out/BiasAdd:0")
        print(out)
        converter = tf.contrib.lite.TFLiteConverter.from_session(sess, [inp], [out])
        tflite_model = converter.convert()
        open("converted_model.tflite", "wb").write(tflite_model)

【问题讨论】:

  • 模型是否有 BatchNorm 层?如果不适用,则该修复程序可能不适用。您可以做的一件事是可视化您的 tflite 图以查看所有层/节点是否看起来都正常 (tensorflow.org/lite/guide/faq)。否则,运行 tflite 图的推理代码中可能存在错误。能发个sn-p吗?
  • 是的,它有几个 BatchNorm 层,我们对图形进行了可视化,到目前为止没有发现任何可疑之处,这是 tflite 的推理代码:gist.github.com/ZyadShokry/a6157e6e6670753f4c98447661753251
  • 你解决了吗?我有一个类似的问题。我使用的模型使用 tf-slim resnet。我想知道这是否来自 tf-slim 到 tflite...
  • 不,我没有解决

标签: tensorflow tensorflow-lite


【解决方案1】:

基本上无法访问代码/架构,我不确定如何运行推理!如果您无法进行推理,那么检查点有什么用 :) ..这就是我解决它的方法 ..我确实可以访问完整代码(EAST 文本检测)和

  • 恢复了预训练的检查点并运行了一个 epoch,在此期间我确保将训练标志设置为 FALSE(请注意,一个 epoch 太短,无法干预在运行足够的 epoch 以创建基线检查点后设置的变量。 .so 它是无害的)
  • epoch 完成后,我只需使用 simple_save 保存模型并生成一个 pb 文件
  • 使用常规 tflite 转换器并在我的推理文件中遵循 tensorflow 页面中的简单代码来设置输入张量、调用并从输出张量中提取值
  • 推断与我通过其他恢复模型和推断的模式获得的结果一样好......基本上无损
  • 我可以简化此过程的唯一方法是,如果我可以将 ckpt 文件直接转换为 pb(使用 bazel 和冻结图),但由于训练标志会在推断时将我带到同一个地方保持不变

如果此解决方法没有帮助,请道歉

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 2019-10-16
    相关资源
    最近更新 更多