我正在开发一个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);
}发布于 2019-07-09 15:35:03
如果我们讨论的是Keras模型(或者TF中的任何其他模型),我们可以轻松地删除最后一层,然后用tf.lite.TFLiteConverter将其转换为TF模型。这不应该是个问题。
现在,在Python中,获取最后一层的权重,并将其转换为一个很好的JSON文件。这个JSON文件可以托管在云上(比如),并且可以被应用程序下载。
权重可以解析为array()对象。TF模型的活动可以与JSON解析的权重相乘。最后,我们应用一个激活来提供预测,这是我们确实需要的!
该模型经过如此精确的训练,很少用于任何其他用例。因此,我认为我们无须担心这个问题。
另外,如果我们使用一些使用请求和API而不是直接加载原始模型的云托管平台,情况会更好。
https://stackoverflow.com/questions/56952190
复制相似问题