我正在开发一个Android应用程序,该应用程序将包含一个tensorflow-lite模型用于离线推理。
我知道要完全避免有人偷走我的模型是不可能的,但是我想给尝试它的人带来困难。
我想将.tflite模型保留在.apk中,但不考虑顶层的权重。然后,在执行时,我可以下载最后一层的权重并将其加载到内存中。
因此,如果有人尝试窃取我的模型,他将获得一个无用的模型,因为由于最后一层的权重缺失而无法使用。
这是我加载.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);
}
答案 0 :(得分:0)
如果我们在谈论Keras模型(或TF中的任何其他模型),我们可以轻松地删除最后一层,然后使用tf.lite.TFLiteConverter
将其转换为TF Lite模型。那应该没问题。
现在,在Python中,获取最后一层的权重并将其转换为漂亮的JSON文件。该JSON文件可以托管在云(如Firebase Cloud Storage)上,并且可以由该应用下载。
权重可以解析为array()
对象。可以将TF Lite模型的作用与从JSON解析的权重相乘。最后,我们应用激活来提供我们确实需要的预测!
模型是如此精确地训练为以至于很少用于其他任何用例。因此,我认为我们不必为此担心。
此外,如果我们使用一些使用请求和API的云托管平台,而不是直接加载原始模型,那就更好了。