簡體   English   中英

沒有OpKernel Tensorflow Mobile Android。 如何調試?

[英]No OpKernel Tensorflow Mobile Android. How to debug?

我知道這是在Android Studio中常見的錯誤。 我以前在'GatherNd'上看到過這個,直到我tf_op_files.txt中的那個檢查了tf_op_files.txt並看到最近已經添加了'gather_nd_op'。 在使用bazel構建之后(盡管jcenter /'none'仍然會生成'GatherNd'),我再也看不到它了。 但是,我現在確實通過“ StridedSlice”看到了這一點。

java.lang.IllegalArgumentException: No OpKernel was registered to support Op 'StridedSlice' with these attrs.  Registered devices: [CPU], Registered kernels:
                                                                       device='CPU'; T in [DT_BFLOAT16]
                                                                       device='CPU'; T in [DT_BOOL]
                                                                       device='CPU'; T in [DT_FLOAT]
                                                                       device='CPU'; T in [DT_INT32]

                                                                         [[Node: roi_align_classifier/strided_slice = StridedSlice[Index=DT_INT32, T=DT_INT64, begin_mask=1, ellipsis_mask=0, end_mask=1, new_axis_mask=0, shrink_axis_mask=2](roi_align_classifier/Where, roi_align_classifier/strided_slice/stack, roi_align_classifier/strided_slice/stack_1, roi_align_classifier/strided_slice/stack_2)]]
                                                                         at org.tensorflow.Session.run(Native Method)
                                                                         at org.tensorflow.Session.access$100(Session.java:48)
                                                                         at org.tensorflow.Session$Runner.runHelper(Session.java:298)
                                                                         at org.tensorflow.Session$Runner.run(Session.java:248)
                                                                         at org.tensorflow.contrib.android.TensorFlowInferenceInterface.run(TensorFlowInferenceInterface.java:218)

我看到該操作存在於tf_op_files.txt並且使用錯誤的參數可能會發生錯誤。 我嘗試將輸入和輸出類型從float []更改為int [],但是沒有運氣。

我在array_ops.cc和https://www.tensorflow.org/api_docs/python/tf/strided_slice中看到類型簽名和有關strided_slice的信息。 但是,對於我只是提供錯誤的參數還是我所使用的StridedSlice實際上不存在,這些都無法提供深刻的見解!

我的問題是:與隨機猜測相比,我如何以更具確定性的方式調試它?

編輯檢查http://www.oreilly.com/data/free/files/building-mobile-applications-with-tensorflow.pdf ,看來此實現是正確的,並且當前不支持移動設備嗎? 即。 此錯誤消息不取決於傳遞的輸入和輸出。 這是正確的嗎? 我認為添加操作非常簡單。 我只需要知道這是否是問題所在,以及類型應該是什么。

我還找到了https://medium.com/joytunes/deploying-a-tensorflow-model-to-android-69d04d1b0cba 就是說,任何在android / type端的調試信息都會很棒。 即。 傳遞給操作的類型是什么,期望什么? 看來我必須使用外部資源來確定

編輯2

找到所有操作后,進行量化,獲取輸入節點的輸入和輸出節點的輸出,我嘗試將strided_slice_op.cc添加到android_extended_ops_group2中,只是在構建時看到它已經存在。 我想我必須添加另一個實現。 有誰知道如何獲取節點的完整類型簽名,這看起來像我在正確的道路上嗎? 在張量板和錯誤中,操作是strided_slice [0-9],而構建是這樣的:

`tf_kernel_library(
    name = "strided_slice_op",
    srcs = [
        "strided_slice_op.cc",
        "strided_slice_op_inst_0.cc",
        "strided_slice_op_inst_1.cc",
        "strided_slice_op_inst_2.cc",
        "strided_slice_op_inst_3.cc",
        "strided_slice_op_inst_4.cc",
        "strided_slice_op_inst_5.cc",
        "strided_slice_op_inst_6.cc",
        "strided_slice_op_inst_7.cc",
    ],
    hdrs = [
        "slice_op.h",
        "strided_slice_op.h",
        "strided_slice_op_impl.h",
    ],
    gpu_srcs = [
        "slice_op.h",
        "strided_slice_op.h",
        "strided_slice_op_impl.h",
        "strided_slice_op_gpu.cu.cc",
    ],
    deps = [
        ":bounds_check",
        ":dense_update_functor",
        ":ops_util",
        ":variable_ops",
        "//tensorflow/core:framework",
        "//tensorflow/core:lib",
        "//third_party/eigen3",
    ],
)`

問題一直困擾着我。 T = DT_INT64不是strided_slice的注冊內核之一。 在切片之前編輯要投射的模型為我解決了這個問題。

參考: https : //github.com/tensorflow/tensorflow/issues/13772

開始注冊自定義操作!

編輯

只需更改操作順序即可!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM