2016-06-20 8 views

Antwort

11

Sie können tf.py_func(func, inp, Tout) verwenden.

Wraps eine Python-Funktion und verwendet sie als Tensorflow-Op.

Gegeben eine Python-Funktion func, die numpy-Arrays als Eingaben akzeptiert und numpy-Arrays als Ausgaben zurückgibt.


Ihre Python-Funktion muss haben:

  • numpy Arrays als Eingaben aus dem Diagramm mit dem Argument zugeführt inp
  • numpy Arrays als Ausgänge, Sie brauchen, um ihre Typen zu spezifizieren TensorFlow im Argument Tout

Innerhalb der Funktion können Sie tun, was y Ou, wenn Bedingungen für for-Schleifen, alles, was in TensorFlow nicht möglich ist.


Jedoch wird der Betrieb auf der CPU ausgeführt werden, so dass er sich langsamer als die äquivalente TensorFlow op in GPU sein kann.

+0

Wie kann ich den Vorgang auf GPU ausführen? Muss ich diese GPU-Version auf C++ implementieren? Gibt es eine Möglichkeit, den Code in Python zu schreiben? –

+0

Ich glaube nicht, dass es eine Möglichkeit gibt, die GPU-Operation in Python zu schreiben. Sie können immer versuchen, eine andere Frage mit der Implementierung, die Sie im Sinn haben, zu öffnen und jemand wird vielleicht eine Idee haben, um es direkt in TensorFlow zu implementieren. –

6

Sie können tf.py_func verwenden, um Python-Funktionen aufzurufen. Die Operationen innerhalb der Funktion können auch auf der GPU ausgeführt werden. Zum Beispiel können wir einen Op und seinen Gradienten rein in Python hinzufügen, der Caffe auf GPU aufruft:

def custom_loss_impl(x): 
    caffe.set_mode_gpu() 
    caffe.set_device(0) 
    ... 
    return np.float32(loss) 

def custom_loss(x): 
    tf.RegisterGradient("custom_loss_grad")(custom_loss_grad) 
    g=tf.get_default_graph() 
    with g.gradient_override_map({"PyFunc":"custom_loss_grad"}): 
     return tf.py_func(custom_loss_impl,[x],[tf.float32])[0] 

def custom_loss_grad_impl(x): 
    caffe.set_mode_gpu() 
    caffe.set_device(0) 
    custom_loss_impl(x) 
    ... 
    return np.float32(gradient) 

def custom_loss_grad(op,grad): 
    x=op.inputs[0] 
    return tf.py_func(custom_loss_grad_impl,[x],[tf.float32])#assume grad=1 
+3

Mit diesem Ansatz, und unter der Annahme, dass der Rest Ihres Tensorflow-Diagramms auf der GPU ist, werden Ihre Daten Tensorflow GPU -> CPU -> Caffe GPU -> CPU -> Tensorflow GPU wieder ..... – Dougal

Verwandte Themen