模型中使用了函数
tensorflow.contrib.signal.stft
在安卓平台中推断出现错误如下:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.hhc.myapplication, PID: 10317
java.lang.IllegalArgumentException: No OpKernel was registered to support Op 'RFFT' used by {{node stft/rfft}}with these attrs: []
Registered devices: [CPU]
Registered kernels:
<no registered kernels>
[[{{node stft/rfft}}]]
at org.tensorflow.Session.run(Native Method)
at org.tensorflow.Session.access$100(Session.java:48)
at org.tensorflow.Session$Runner.runHelper(Session.java:314)
at org.tensorflow.Session$Runner.run(Session.java:264)
at org.tensorflow.contrib.android.TensorFlowInferenceInterface.run(TensorFlowInferenceInterface.java:228)
at org.tensorflow.contrib.android.TensorFlowInferenceInterface.run(TensorFlowInferenceInterface.java:197)
at org.tensorflow.contrib.android.TensorFlowInferenceInterface.run(TensorFlowInferenceInterface.java:187)
at com.example.hhc.myapplication.MainActivity.recognizeRecord(MainActivity.java:193)
at com.example.hhc.myapplication.MainActivity$2.onClick(MainActivity.java:104)
at android.view.View.performClick(View.java:4848)
at android.view.View$PerformClick.run(View.java:20262)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5631)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
原因:默认编译的android用TF library,只实现了部分op,当使用的op不在默认范围内时,需要自己添加对应的op。
图片来源:https://github.com/tensorflow/tensorflow/issues/11804
解决方案:经过网上查找,对应我使用的函数,需要添加的是“fft_op.cc”,其路径为tf的源码目录中的"/tensorflow/tensorflow/core/kernels/fft_op.cc"。添加这个文件的编译,需要修改“/tensorflow/tensorflow/core/framework/register_types.h”文件,在其中添加"fft_op",如下。然后,按照原来的命令编译即可。
filegroup(
name = "android_extended_ops_group2",
srcs = [
...
"maxpooling_op.cc",
"mfcc.cc",
"mfcc_dct.cc",
"mfcc_mel_filterbank.cc",
"mfcc_op.cc",
"fft_ops.cc", //添加ffc_ops
"mirror_pad_op.cc",
"mirror_pad_op_cpu_impl_1.cc",
"mirror_pad_op_cpu_impl_2.cc",
"mirror_pad_op_cpu_impl_3.cc",
"mirror_pad_op_cpu_impl_4.cc",
"mirror_pad_op_cpu_impl_5.cc",
...
":android_extended_ops_headers",
],
)
参考链接:https://github.com/tensorflow/models/issues/1740
另附
android 用TF library 编译教程连接:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/android/README.md