2017-12-25 4 views
1

Ich weiß, das ist ein sehr häufiger Fehler in Android Studio zu sehen. Ich habe diese für ‚GatherNd‘, um zu sehen, bis ich meine tf_op_files.txt gegen die in Master geprüft und sah, dass ‚gather_nd_op‘ vor kurzem hinzugefügt worden war. Nach dem Bauen mit Bazel (obwohl es scheint, dass jcenter/'none' immer noch ergibt, dass "GatherNd" nicht gefunden wurde), sehe ich das nicht mehr. Allerdings sehe ich das jetzt mit 'StridedSlice'.Kein OpKernel Tensorflow Mobile Android. Wie zu debuggen?

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) 

Ich sehe, dass diese op in tf_op_files.txt vorhanden ist und dass der Fehler von der Verwendung der falschen Parametern auftreten können. Ich habe versucht, die Eingabe- und Ausgabetypen von float [] nach int [] zu ändern, aber kein Glück.

Ich sehe die Art Unterschrift und Daten zu strided_slice in array_ops.cc und https://www.tensorflow.org/api_docs/python/tf/strided_slice. Allerdings liefern diese keine großartigen Erkenntnisse darüber, ob ich nur die falschen Parameter liefere oder die StridedSlice die ich benutze eigentlich gar nicht existiert!

Meine Frage ist: Wie Debuggen ich dies in einer deterministischen Art und Weise als zufällige Erraten?

bearbeiten prüfen http://www.oreilly.com/data/free/files/building-mobile-applications-with-tensorflow.pdf, es scheint diese Implementierung korrekt ist, und dass es für den mobilen derzeit nicht unterstützt wird? dh. Diese Fehlermeldung hängt nicht von der übergebenen und ausgegebenen Ausgabe ab. Ist das richtig? Ich denke, das Hinzufügen der Op wäre ziemlich einfach. Ich muss nur wissen, ob das das Problem ist und was der Typ sein soll.

Ich habe auch festgestellt https://medium.com/joytunes/deploying-a-tensorflow-model-to-android-69d04d1b0cba. Das heißt, jede Debugging-Information auf der android/type-Seite wäre großartig. dh. Was ist der Typ, der an die OP weitergegeben wird und was erwartet sie? Es scheint, dass ich außerhalb Ressourcen zu nutzen, haben dies nach der Suche alle ops

Edit 2

, um zu bestimmen, Quantisierung, die Eingänge von Eingangsknoten und Ausgänge von Ausgangsknoten bekommen, habe ich versucht, die strided_slice_op.cc Hinzufügen zu der android_extended_ops_group2 nur um zu sehen, dass es bereits beim Bauen existierte. Ich denke, ich muss eine andere Implementierung hinzufügen. Weiß jemand, wie man die volle Typunterschrift der Knoten bekommt und scheint dies, als ob ich auf dem richtigen Weg bin? In tensorboard und in den Fehler, ist die op strided_slice [0-9], während der Build wie so ist:

`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", 
    ], 
)` 

Antwort

0

Das Problem mir ins Gesicht die ganze Zeit anstarrte. T = DT_INT64 ist keiner der registrierten Kernel für strided_slice. Das Bearbeiten des Modells vor dem Schneiden hat das Problem für mich gelöst.

Ref: https://github.com/tensorflow/tensorflow/issues/13772

auf eine individuelle op Registrierung notwendig!

bearbeiten

nur notwendig, um die Reihenfolge der Operationen zu ändern!

Verwandte Themen