2017-04-18 2 views
1

Es ist im Zusammenhang mit: tensorflow modify variables in py_func (and its grad func)Stücke von numerisch identischen Code erzeugen drastisch unterschiedliche Ergebnisse

ich meine eigene op und ihre Gradienten in TensorFlow mit dieser Funktion definieren.

# define gradient of a python function 
def py_func_with_grad(func, inp, Tout, stateful=True, name=None, grad=None): 
    num = [] 
    for i in range(100): 
     num.append(str(np.random.randint(0,10))) 
    rnd_name = 'PyFuncGrad' + ''.join(num) 
    tf.RegisterGradient(rnd_name)(grad) 
    g = tf.get_default_graph() 
    with g.gradient_override_map({"PyFunc": rnd_name}): 
     return tf.py_func(func, inp, Tout, stateful=stateful, name=name) 

Ich habe ein neuronales Netzwerk, das das folgende Codefragment enthält, wo I 5 numerisch identische Linien (I verwende eine von ihnen einmal). Sie produzieren drastisch unterschiedliche Ergebnisse. Ich frage mich, ob jemand eine Ahnung hat. Vielen Dank!!

Zum Beispiel ist es so komisch, dass in (1) und (2) durch bloßes Ersetzen von x durch eine TF-Variable (s_final) einen solchen Unterschied machen kann. Ich dachte, da sie numerisch gleich sind, sollte es keinen Unterschied geben.

s_final ist ein Tensorflow nicht trainierbar Variable.

def _idenity_func(x,s): 
     return s 
    def _dummy_grad(op,grad): 
     return grad*0,grad*0 

    assign_op_s_final_2 = s_final.assign(x) 
    with tf.control_dependencies([assign_op_s_final_2]): 
     x = tf.identity(x) 

    x = tf.stop_gradient(x) 

    # the three following lines should be numerically identical. since s_final has been assigned the value of x. but... 
    # (1) use the following line, the network does not learn AT ALL!! 
    x_revised = py_func_with_grad(_idenity_func, [x, s_final], [tf.float32], name=name, grad=lambda op,grad: _dummy_grad(op,grad)) 
    # (2) use the following line, the network learns, even if x does not need any gradient (since there is tf.stop_gradient) 
    # x_revised = py_func_with_grad(_idenity_func, [x, x], [tf.float32], name=name, grad=lambda op,grad: _dummy_grad(op,grad)) 
    # (3) use the following line, the network learns as well as (2) 
    # x_revised = tf.stop_gradient(x) 
    # (4) use the following line, the network learns, but seems not as well as (2) 
    # x_revised = tf.stop_gradient(s_final) 
    # (5) use the following line, the network does not learn AT ALL!! 
    # x_revised = py_func_with_grad(_idenity_func, [x, tf.stop_gradient(s_final)], [tf.float32], name=name, grad=lambda op,grad: _dummy_grad(op,grad)) 

-Code zur Verfügung gestellt wird (erfordert tensorflow 0.12.1 Ist mit Version> = 1, da die Umsetzung der HyperNetworks tensorflow Version> = 1 nicht unterstützt nicht.):

https://www.dropbox.com/s/58khyqdy3mtnri7/tensorflow_clean_ver01.zip?dl=0

Die über Zeilen sind in dem Code, den wir bereitstellen. Ändern Sie sie und führen Sie das Modell aus, um Unterschiede zu sehen. Lassen Sie mich eine Frage über den Code wissen.

können Sie installieren tensorflow 0.12.1 in einen temporären Ordner:

export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.1-cp27-none-linux_x86_64.whl 
pip install --target=$HOME/tensorflow_versions/tf-0.12.1 --upgrade $TF_BINARY_URL 

Dann wird der Pfad hinzugefügt wird, wenn Sie den mitgelieferten Code ausführen. Ich verwende diesen Ansatz, um mehrere Versionen von Tensorflow auf meinem Computer zu haben.

+0

Jeder Kommentar ist willkommen! – DataHungry

+0

Können Sie ein praktisches Beispiel angeben, damit wir unsere eigenen Tests einfach durchführen können? Sonst ist es zu viel Arbeit. –

+0

@ onurgüng Code wird zur Verfügung gestellt – DataHungry

Antwort

0

Funktioniert gut in meinen Experimenten: Ich fügte Code hinzu, der x_revised verwendet, und betrachtete die Werte von Gradienten in Bezug auf andere beteiligten Variablen. Der Fehler muss in dem Code sein, der nicht gepostet wird.

+0

Code wird zur Verfügung gestellt – DataHungry

0

Meine Vermutung ist, dass die Zuweisung nicht wirklich ausgeführt wird. Beachten Sie, dass Sie nur das Diagramm erstellen, nichts wird noch ausgeführt (nicht wie Pytorch) ...

Verwandte Themen