确保tensorflow-lite模型

时间:2019-07-09 12:03:43

标签: android tensorflow tensorflow-lite

我正在开发一个Android应用程序,该应用程序将包含一个tensorflow-lite模型用于离线推理。

我知道要完全避免有人偷走我的模型是不可能的,但是我想给尝试它的人带来困难。

我想将.tflite模型保留在.apk中,但不考虑顶层的权重。然后,在执行时,我可以下载最后一层的权重并将其加载到内存中。

因此,如果有人尝试窃取我的模型,他将获得一个无用的模型,因为由于最后一层的权重缺失而无法使用。

  1. 是否可以生成没有最后一层权重的tflite模型?
  2. 是否可以将这些权重加载到内存中已加载的模型中?

这是我加载.tflite模型的方式:

    tflite = new Interpreter(loadModelFile(), tfliteOptions);

    // loads tflite grapg from file
    private MappedByteBuffer loadModelFile() throws IOException {
        AssetFileDescriptor fileDescriptor = mAssetManager.openFd(chosen);
        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);
    }
  1. 还有其他方法可以使我的模型更安全吗?我真的需要在本地进行推断。

1 个答案:

答案 0 :(得分:0)

如果我们在谈论Keras模型(或TF中的任何其他模型),我们可以轻松地删除最后一层,然后使用tf.lite.TFLiteConverter将其转换为TF Lite模型。那应该没问题。

  

现在,在Python中,获取最后一层的权重并将其转换为漂亮的JSON文件。该JSON文件可以托管在云(如Firebase Cloud Storage)上,并且可以由该应用下载。

权重可以解析为array()对象。可以将TF Lite模型的作用与从JSON解析的权重相乘。最后,我们应用激活来提供我们确实需要的预测!

  

模型是如此精确地训练为以至于很少用于其他任何用例。因此,我认为我们不必为此担心。

此外,如果我们使用一些使用请求和API的云托管平台,而不是直接加载原始模型,那就更好了。