【问题标题】:How to find the Input and Output Tensors for converting a .PB file (Faster RCNN Model) to a TFlite file?如何找到将 .PB 文件(Faster RCNN 模型)转换为 TFlite 文件的输入和输出张量?
【发布时间】:2019-07-29 15:20:23
【问题描述】:

我使用 Faster RCNN 构建了一个对象检测模型,并能够生成 Frozen_Graph.pb 文件。现在我正在尝试将 .pb 文件转换为 TFlite 文件以便在 Android 上使用它。但是我在转换时遇到了问题。因为它需要输入张量和输出传感器进行转换。

我无法确定要传递的正确输入和输出数组。即使我将输入张量作为Image_tensor 传递,它也会引发错误说明

 ValueError: None is only supported in the 1st dimension. Tensor 'image_tensor:0' has invalid shape '[None, None, None, 3]

以下是我用于转换的代码:

graph_def_file = "/models/mobilenet_thin_model.pb"
input_arrays = ["image_tensor"]
output_arrays = ["Softmax"]

converter = tf.lite.TFLiteConverter.from_frozen_graph(graph_def_file,input_arrays, output_arrays)

tflite_model = converter.convert()
open("/models/converted_model.tflite", "wb").write(tflite_model)

【问题讨论】:

    标签: python-3.x tensorflow object-detection


    【解决方案1】:

    您必须打开图表并对其进行解析。然后打印每个节点。

    import tensorflow as tf
    Graph = tf.GraphDef()   
    File = open("Model.pb","rb")
    Graph.ParseFromString(File.read())
    
    for Layer in Graph.node:
        print(Layer.name)
    

    或者直接获取最后一个

    print(Graph.node[-1].name)
    

    顺便说一句。你是如何在你的应用程序中实现 TensorFlow 的?使用 import org.tensorflow.lite.Interpreter 时不需要名称。您只需使用输入和输出缓冲区调用 run

    我的一个示例,基于 TensorFlow 示例实现:

    private ByteBuffer _mInput;
    private float[][] _mOutput;
    
    Interpreter.Options _mTfliteOptions = new Interpreter.Options();
    _mTfliteOptions.setNumThreads(1);
    _mTfliteOptions.setUseNNAPI(true);
    
    _mInput = ByteBuffer.allocateDirect(4 * 1 * Width * Height * Channels);
    _mInput.order(ByteOrder.nativeOrder());
    
    _mOutput = new float[1][_mClassLabels.size()];
    
    _mTfLite = new Interpreter(loadModelFile(getActivity().getAssets(),"Model.tflite"), _mTfliteOptions);
    _mTfLite.run(_mInput, _mOutput);
    
    private MappedByteBuffer loadModelFile(AssetManager Manager, String Path) throws IOException
    {
        AssetFileDescriptor fileDescriptor = Manager.openFd(Path);
        FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
        FileChannel fileChannel = inputStream.getChannel();
        long startOffset = fileDescriptor.getStartOffset();
        long declaredLength = fileDescriptor.getDeclaredLength();
        return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
    }
    

    【讨论】:

    • 嗨@Kampi 感谢您的帮助。我在 windows 中使用 python 来实现。现在我可以获得输出张量,但是如果我将输入张量输入为“image_tensor”,它会抛出相同的错误:“invalid shape '{1}'.”.format(_tensor_name(tensor), shape_list)) ValueError : None 仅在第 1 维中受支持。张量“image_tensor”的形状无效“[None, None, None, 3]”。
    • 嗨@Kampi 现在我能够获取输入和输出张量名称,并且我还能够在这些上运行 tf.lite.TFLiteConverter.from_frozen_graph() 函数。但现在我面临以下问题:“TOCO 失败。有关信息,请参阅控制台。\n%s\n%s\n”% (stdout, stderr)) ConverterError: TOCO failed。有关信息,请参阅控制台。
    • 请检查this是否对您有帮助。
    • 尝试使用 TF-nightly 但仍然遇到同样的错误
    • 是的,我在将 .pb 文件转换为 .tflite 时也遇到了一些问题。你有 Keras 模型的模型吗?您可以直接将 Keras 转换为 TFLite。
    猜你喜欢
    • 2018-12-09
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    相关资源
    最近更新 更多