TLDR:如何在Android上使用冻结tensorflow图中的变量?
1。我想做什么
我有一个Tensorflow模型,它在多个变量中保持一个内部状态,用:state_var = tf.Variable(tf.zeros(shape, dtype=tf.float32), name='state', trainable=False)创建。在
此状态在推断过程中被修改:tf.assign(state_var, new_value)
我现在想在Android上部署这个模型。我能够让Tensorflow示例应用程序运行。在那里,加载了一个冻结的模型,工作正常。在
2。从冻结图恢复变量不起作用
但是,当您使用freeze_graph script冻结图形时,所有变量都将转换为常量。这对于网络的权重是好的,但对于内部状态则不是这样。推理失败,并显示以下消息。我把它解释为“赋值不适用于常量张量”
^{pr2}$
幸运的是,您可以将转换为常量的变量列入黑名单。但是,这也不起作用,因为冻结的图形现在包含未初始化的变量。在java.lang.IllegalStateException: Attempting to use uninitialized value layer_7/state
3。恢复SavedModel在Android上不起作用
我尝试过的最后一个版本是使用SavedModel格式,它应该同时包含冻结的图形和变量。不幸的是,调用restore方法在Android上不起作用。在SavedModelBundle bundle = SavedModelBundle.load(modelFilename, modelTag);
// produces error:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: org.tensorflow.demo, PID: 27451
java.lang.UnsupportedOperationException: Loading a SavedModel is not supported in Android. File a bug at https://github.com/tensorflow/tensorflow/issues if this feature is important to you at org.tensorflow.SavedModelBundle.load(Native Method)
4。我该怎么做?
我不知道还能做什么。以下是我的想象,但我不知道如何让它工作:找出一种在Android上初始化变量的方法
找出一种不同的方法来冻结模型,这样初始化器op可能也是冻结图的一部分,可以从Android运行
如果在Android上也需要使用lsti/rns来实现这些变量,那么这些变量应该是如何在内部实现的。在
???在