2017-03-15 2 views
1

zu unterstützen Ich habe Mobil und Embedded TensorFlow (TensorFlow Dev Summit 2017) Video auf yotube, Hier klicken video link.Kein OpKernel wurde registriert, um Op 'Add' mit diesen attrs auf Android

In dem Video habe ich eine Funktion gelernt, um Tensorflow so Dateigröße auf Android zu reduzieren.

ich hier

"""Prints a header file to be used with SELECTIVE_REGISTRATION. 

Example usage: 
print_selective_registration_header \ 
--graphs=path/to/graph.pb > ops_to_register.h 

Then when compiling tensorflow, include ops_to_register.h in the  include 
search path and pass -DSELECTIVE_REGISTRATION - see 
core/framework/selective_registration.h for more details. 
""" 

die * .pb Datei selbst ist, dann erhalte ich die ops_to_register.h Datei hier

#ifndef OPS_TO_REGISTER 
    #define OPS_TO_REGISTER 
    constexpr inline bool ShouldRegisterOp(const char op[]) { 
     return false 
    || (strcmp(op, "Add") == 0) 
    || (strcmp(op, "Const") == 0) 
    || (strcmp(op, "Conv2D") == 0) 
    || (strcmp(op, "Exp") == 0) 
    || (strcmp(op, "Identity") == 0) 
    || (strcmp(op, "Max") == 0) 
    || (strcmp(op, "MaxPool") == 0) 
    || (strcmp(op, "NoOp") == 0) 
    || (strcmp(op, "Placeholder") == 0) 
    || (strcmp(op, "RealDiv") == 0) 
    || (strcmp(op, "Relu") == 0) 
    || (strcmp(op, "Reshape") == 0) 
    || (strcmp(op, "Sub") == 0) 
    || (strcmp(op, "Sum") == 0) 
    || (strcmp(op, "_Recv") == 0) 
    || (strcmp(op, "_Send") == 0) 
    ; 
    } 
    #define SHOULD_REGISTER_OP(op) ShouldRegisterOp(op) 

    const char kNecessaryOpKernelClasses[] = "," 
"BinaryOp< CPUDevice, functor::add<float>>," 
"ConstantOp," 
"Conv2DOp<CPUDevice, float>," 
"UnaryOp< CPUDevice, functor::exp<float>>," 
    "IdentityOp," 
"ReductionOp<CPUDevice, float, Eigen::internal::MaxReducer<float>>," 
"MaxPoolingOp<CPUDevice, float>," 
"NoOp," 
    "PlaceholderOp," 
"BinaryOp< CPUDevice, functor::div<float>>," 
    "ReluOp<CPUDevice, float>," 
"ReshapeOp," 
"BinaryOp< CPUDevice, functor::sub<float>>," 
"ReductionOp<CPUDevice, float, Eigen::internal::SumReducer<float>>," 
"RecvOp," 
"SendOp," 
; 
#define SHOULD_REGISTER_OP_KERNEL(clz)    (strstr(kNecessaryOpKernelClasses, "," clz ",") != nullptr) 

#define SHOULD_REGISTER_OP_GRADIENT false 
#endif 

Ich habe ops_to_register.h in tensorflow/tensorflow/core/Framework dir, und ich definiere SELECTIVE_REGISTRATION in select_registration.h.

dann betreibe ich

bazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so --crosstool_top=//external:android/crosstool [email protected]_tools//tools/cpp:toolchain --cpu=armeabi-v7a --verbose_failures 

In android Projekt, verwende ich libtensorflow_inference.so mein .pb Modell laufen, aber bekommen die ausgefallene Info:

native: tensorflow_inference_jni.cc:145 Could not create TensorFlow graph: Invalid argument: No OpKernel was registered to support Op 'Add' with these attrs. Registered devices: [CPU], Registered kernels: 
                 <no registered kernels> 

                 [[Node: add_1 = Add[T=DT_FLOAT](Conv2D, Reshape)]] 

Antwort

0

Dieser Fehler beacuse irgendeinem Problem in tesorflow Zweig haben Sie einen Fehler, lösen Sie das Problem ist einfach.

BinaryOp< CPUDevice, functor::div<float>> change to BinaryOp<CPUDevice, functor::div<float>>, the change is no space。

Verwandte Themen