如何调试TFlite转换?

时间:2018-10-14 20:14:25

标签: tensorflow-lite

我正在尝试使用tensorflow lite toco转换器以获取tflite图。 我使用toco命令行,以获得tflite图。转换过程中没有出现任何错误,但是看来我的转换中包含垃圾(输出是nans)。我正在寻求有关如何调试此转换的想法。

我执行以下步骤:

  1. 加载.ckpt文件并转换为Frozen_graph:

    带有g.as_default(),g.device(device_t),\         tf.Session(config = soft_config)作为会话:     batch_shape =(batch_size,)+ img_shape     img_placeholder = tf.placeholder(tf.float32,shape = batch_shape,                                      name ='img_placeholder')

    preds = transform(img_placeholder)
    
    saver = tf.train.Saver()
    saver.restore(sess, checkpoint_dir)
    frozen_graph_def = tf.graph_util.convert_variables_to_constants(sess,sess.graph_def,['transformer/up-sample/mul'])
    with open('frozeen_graph.pb', 'wb') as f:
        f.write(frozen_graph_def.SerializeToString())
    

要解决的问题:上面的代码是否等同于使用tensorflow / python / tools / freeze_graph.py脚本?

当我使用上面的代码时,我还通过对冻结的图形进行劳动检查冻结,并通过它传递输入图像,输出看起来不错。因此,似乎冻结起作用了。

  1. 使用toco转换命令行(在tensorflow版本1.10和tensorflow nightly-gpu中试用)
  

toco \ --graph_def_file = frozeen_graph.pb \
  --output_file = converted_graph.lite \ --input_format = TENSORFLOW_GRAPHDEF \ --output_format = TFLITE \ --input_shape = 1,256,256,3 \ --input_array = img_placeholder:0 \ --output_array = transformer / up-sample / mul:0 \ --inference_type = FLOAT \ --input_data_type = FLOAT

当我执行以上代码时,我没有任何错误。请注意,我更改了图形以消除一些“不支持的操作”错误。

  1. 接下来,我使用tensorflow lite解释器来测试转换后的图(使用python API):

    tflite_graph_filename = 'converted_graph.lite'
    # Load TFLite model and allocate tensors.
    interpreter = 
    tf.contrib.lite.Interpreter(model_path=tflite_graph_filename)
    interpreter.allocate_tensors()
    
    # Get input and output tensors.
    input_details = interpreter.get_input_details()
    output_details = interpreter.get_output_details()
    
    input_shape = input_details[0]['shape']
    
    X = np.zeros(input_shape,np.float32)
    X[0] = content_image
    
    input_data = X 
    interpreter.set_tensor(input_details[0]['index'], input_data)
    
    interpreter.invoke()
    output_data = interpreter.get_tensor(output_details[0]['index'])
    

    不幸的是,output_data都是 nanes

有人可以给我一些调试建议或正确的转换方法吗?

谢谢, 瓦迪姆

1 个答案:

答案 0 :(得分:0)

将.pb转换为.lite的简单方法在这里得到回答:

https://stackoverflow.com/a/58583419/11517841

为确保您没有犯任何与架构相关的错误,请您在FYI /“当心”:

https://stackoverflow.com/a/58583602/11517841