【问题标题】:Different model on speech recognition语音识别的不同模型
【发布时间】:2019-12-22 11:10:15
【问题描述】:

我已经尝试了很多时间来运行这个示例项目https://github.com/tensorflow/examples/tree/master/lite/examples/speech_commands/ml,最后使用导出目录中的 convert_keras_lite.py 生成了这个 tflite 模型https://imgur.com/bVpesdd。但是,我检查了这个 android 项目 @987654323 中资产目录中的 tflite 模型@。我发现 tflite 模型与第一个模型不同。 https://imgur.com/7Cn69qx.

我尝试将 assets android 目录中的 tflite 模型替换为第一个 tflite 模型,但应用程序突然崩溃并在 Android Studio logcat 中显示以下错误代码:

2019-12-22 16:45:22.262 795-795/org.tensorflow.lite.examples.speech E/AndroidRuntime: FATAL EXCEPTION: main
    Process: org.tensorflow.lite.examples.speech, PID: 795
    java.lang.RuntimeException: Unable to start activity ComponentInfo{org.tensorflow.lite.examples.speech/org.tensorflow.lite.examples.speech.SpeechActivity}: java.lang.IllegalArgumentException: Input error: Can not resize 1-th input for a model having 1 inputs.
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3139)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3282)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1970)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7156)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)
     Caused by: java.lang.IllegalArgumentException: Input error: Can not resize 1-th input for a model having 1 inputs.
        at org.tensorflow.lite.NativeInterpreterWrapper.resizeInput(Native Method)
        at org.tensorflow.lite.NativeInterpreterWrapper.resizeInput(NativeInterpreterWrapper.java:194)
        at org.tensorflow.lite.Interpreter.resizeInput(Interpreter.java:285)
        at org.tensorflow.lite.examples.speech.SpeechActivity.onCreate(SpeechActivity.java:190)
        at android.app.Activity.performCreate(Activity.java:7335)
        at android.app.Activity.performCreate(Activity.java:7326)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1275)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3119)**

感谢任何帮助。

【问题讨论】:

  • 我也遇到了同样的问题!发现很难正确地构建和转换模型。你找到解决办法了吗?
  • 还没有。我仍然努力尝试。希望这个问题能得到解决。
  • 今晚或明天我会再试一次。如果我有突发新闻,我会通知你。
  • 您能告诉我图形可视化工具的名称是什么吗?
  • 使用lutzroeder.github.io/netron 可视化您创建的模型。

标签: android tensorflow keras speech


【解决方案1】:

好的,我还没有解决问题,但我想我发现了一些可能有帮助的东西:

首先,TensorFlow 存储库本身(不是专用示例存储库)中的语音命令示例还有其他代码:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/speech_commands

它不像您正在使用的那样使用 keras,并且没有关于 tflite 转换的信息,所以我猜这个示例是在 tflite 出现之前创建的。 在查看了那里使用的architecture of the (conv) model后,我发现它与android项目中预打包的tflite模型的架构相同,并且与您发布的第二个imgur链接匹配。

所以看起来 android 项目中的 tflite 模型是旧示例中模型的转换。而https://github.com/tensorflow/examples/tree/master/lite/examples/speech_commands/ml产生的模型根本不兼容android代码,因为输入不同。

这并不奇怪,因为 android 代码几乎是从 old examples android code 复制粘贴,并针对 tflite 的使用做了一些调整。

所以我想最好的办法是处理旧的 ml 代码并将生成的冻结 pb 图转换为 tflite。

更新

我做到了!!! 以下是它的工作原理:

  • here下载冻结图。
  • 在 python 中运行以下命令
import tensorflow as tf

converter = tf.compat.v1.lite.TFLiteConverter.from_frozen_graph("./conv_actions_frozen.pb", input_arrays=['decoded_sample_data', 'decoded_sample_data:1'], output_arrays=['labels_softmax'])
converter.allow_custom_ops=True
tflite_model = converter.convert()
open("model.tflite", "wb").write(model)

如果您使用 netron 查看模型,您会发现它与 android 示例附带的模型相同。

【讨论】:

  • 感谢您的建议。你使用什么 python 和 tensorflow 版本?我在我的 python 3.7.6 和 tensorflow 2.0 中尝试过,但它不像你的那样工作。
  • 是的,我有完全相同的版本。究竟是什么不适合你?
  • 当我尝试tflite_model = converter.convert()时,错误代码突然出现这样的imgur.com/a/8NwNTjy。我无法继续运行下一个代码。
  • 您确定您使用的是正确的tf.compat.v1.lite.TFLiteConverter
  • 是的。我一步一步地按照你的代码,因为converter = tf.compat.v1.lite.TFLiteConverter.from_frozen_graph("./conv_actions_frozen.pb", input_arrays=['decoded_sample_data', 'decoded_sample_data:1'], output_arrays=['labels_softmax']) 包含 tf.compat.v1.lite.TFLiteConverter。当我执行此代码时,没有错误消息,直到我执行此 When i try tflite_model = converter.convert() 并突然收到错误消息。
猜你喜欢
  • 2022-12-14
  • 2010-11-16
  • 2018-02-23
  • 1970-01-01
  • 2023-02-26
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 2018-04-17
相关资源
最近更新 更多