将预训练的Tensorflow模型转换为Tf-lite时的Nan输出

时间:2019-05-22 19:08:28

标签: tensorflow tensorflow-lite

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

snapshot_140.ckpt.index

snapshot_140.ckpt.meta

snapshot_140.ckpt.data-00000-of-00001

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

我们在上面获得了这些文件,通过tensorflow.python.tools.freeze_graph工具从ckpt文件转换为tensorflow .pb图

然后使用TFlite_converter工具转换为tflite

.pb制成张量流模型时效果很好..但是tflite模型会产生所有的nan输出

一个(潜在解决方案)的灵感来自于此问题: https://github.com/tensorflow/tensorflow/issues/22803?fbclid=IwAR0x25CEZjHAQ0dUFBVWa1V3lVcCVIpT4q7lbUUGS9T59w2aXqnUVtNCBHI#issuecomment-474249701

那么,如果仅给ckpt文件提供了访问模型体系结构的权限,如何将batch_norm is_training标志设置为false?

如果这确实是解决问题的方法

或者我们应该怎么做才能修复张量流精简模型以提供与张量流模型相同的输出

此代码用于获取提供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)

1 个答案:

答案 0 :(得分:0)

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

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

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