2017-08-24 2 views
0

Ich versuche, eine neue op in tensorflow zu implementieren, gibt es drei Eingänge Tensoren und zwei Ausgänge Tensoren wie folgt (einige Codes aufgrund ignoriert werden auf diese Frage nicht verwandten):Wie definiert man die Gradientenfunktion für diesen Op im Tensorflow?

REGISTER_OP("MyNewFuncOp") 
    .Attr("alpha: float = 1.0") 
    .Attr("beta: float = 1.0") 
    .Attr("debug: bool = false") 
    .Input("input1: float32") 
    .Input("input2: float32") 
    .Input("input3: float32") 
    .Output("output1: float32") 
    .Output("output2: float32") 
    .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { 
     c->set_output(0, c->input(0)); 
     c->set_output(1, c->input(1)); 
     return Status::OK(); 
    }); 

class MyNewFuncOp : public OpKernel { 
public: 
    explicit MyNewFuncOp(OpKernelConstruction* context) : OpKernel(context) { 
    // some staffs 
    ... 
    } 
void Compute(OpKernelContext* context) override { 
    // some staffs 
    ... 
    Tensor* output_tensor1 = NULL; 
    OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape({height, width, channels}), 
               &output_tensor1)); 
    Tensor* output_tensor2 = NULL; 
    OP_REQUIRES_OK(context, context->allocate_output(1, TensorShape({height, width, channels}), 
               &output_tensor2)); 

// some other staffs 
... 
} 

Und die Steigung Registrierung wie folgt:

import tensorflow as tf 
from tensorflow.python.framework import ops 
custom_module = tf.load_op_library('MyNewFunc.so') 

@ops.RegisterGradient("MyNewFun") 
def _MyNewFun_grad(op, grad1, grad2): 
    input3 = op.inputs[2] 
    return [grad1, grad2, tf.zeros_like(input3)] 

aber diese Gradientenfunktion von meinen Versuchen scheint falsch, kann es laufen OK, aber nach dem grads = opt.compute_gradients(total_loss) in Build Ausbildung Bediener läuft, wird dies op falsche Ergebnisse erzeugen. Aber diese Operation kann OK ausführen und auch korrekte Ergebnisse im Bewertungsstatus erzeugen (kein Training, d. H. Keine Gradientenberechnung). Ich stelle also fest, dass diese Gradientenfunktion falsch ist. Ich habe diese Seite in offiziellen Dokumenten https://github.com/tensorflow/tensorflow/blob/master/tensorflow/docs_src/extend/adding_an_op.md#implement-gradient gelesen. In diesem Fall möchte ich nur, dass die oberen Fehler angekommen sind. Die zwei Ausgangstensoren (output1 und output2) werden direkt zu den ersten beiden Eingangstensoren (d. H. input1 und input2) kopiert (rückpropagiert).

Wie könnte ich die richtige Gradientenfunktion für diese Op implementieren? Vielen Dank.

Antwort

0

bekam schließlich die Antwort:

import tensorflow as tf 
from tensorflow.python.framework import ops 
custom_module = tf.load_op_library('MyNewFunc.so') 

@ops.RegisterGradient("MyNewFun") 
def _MyNewFun_grad(_, *grads): 
    return list(grads) + [None] 
+1

Nizza. Wenn Sie möchten, dass Ihr op für das Training über die C++ API (dh für die Verwendung in anderen Sprachenbindungen) verwendbar ist, können Sie C++ - Gradienten hinzufügen, indem Sie folgende Anweisungen befolgen: https://github.com/tensorflow/tensorflow/blob/ Master/Tensorflow/cc/Gradienten/README.md – suharshs

+0

Hallo, @ suharshs, vielen Dank für Ihren freundlichen Vorschlag! – mining

Verwandte Themen